save u8 to string id mapping
All checks were successful
Build / build (push) Successful in 1m59s

This commit is contained in:
Max Känner 2025-01-21 23:20:43 +01:00
parent 108aeaa49d
commit 3a163fd6e7
4 changed files with 35 additions and 15 deletions

View File

@ -19,7 +19,7 @@ nursery = "warn"
# server
tokio = { version = "1.43", features = ["net", "macros", "rt-multi-thread"] }
axum = { version = "0.8", features = ["http2", "multipart", "ws"] }
serde = { version = "1.0", features = ["derive"] }
serde = { version = "1.0", features = ["derive", "rc"] }
# logging
log = "0.4"

View File

@ -1,4 +1,7 @@
use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::{
atomic::{AtomicU32, Ordering},
Arc,
};
use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion};
@ -9,7 +12,7 @@ use battlesnake::types::{
};
fn create_start_snake(coord: Coord) -> Battlesnake {
let id = format!("{coord:?}");
let id: Arc<str> = format!("{coord:?}").into();
Battlesnake {
id: id.clone(),
name: id.clone(),
@ -18,7 +21,7 @@ fn create_start_snake(coord: Coord) -> Battlesnake {
latency: "0".into(),
head: coord,
length: 3,
shout: String::new(),
shout: None,
squad: id,
}
}

View File

@ -3,6 +3,7 @@ use std::{
fmt::Display,
num::NonZeroUsize,
ops::{Deref, DerefMut},
sync::Arc,
};
use bitvec::prelude::*;
@ -70,6 +71,7 @@ pub struct Board {
free: SmallBitBox,
snakes: Vec<Snake>,
constrictor: bool,
id_map: Arc<[(u8, Arc<str>)]>,
}
impl From<&Request> for Board {
@ -77,6 +79,18 @@ impl From<&Request> for Board {
let width = value.board.width;
let height = value.board.height;
let fields = usize::from(width) * usize::from(height);
let id_map = value
.board
.snakes
.iter()
.enumerate()
.filter_map(|(i, snake)| {
u8::try_from(i)
.inspect_err(|e| warn!("unable to convert id to u8: {e}"))
.ok()
.map(|i| (i, snake.id.clone()))
})
.collect::<Vec<_>>();
let mut board = Self {
width,
height,
@ -88,7 +102,8 @@ impl From<&Request> for Board {
hazard: SmallBitBox::new(false, fields),
free: SmallBitBox::new(true, fields),
snakes: Vec::with_capacity(value.board.snakes.len()),
constrictor: value.game.ruleset.name == "constrictor",
constrictor: &*value.game.ruleset.name == "constrictor",
id_map: id_map.into(),
};
for &food in &value.board.food {

View File

@ -1,3 +1,5 @@
use std::sync::Arc;
use serde::{Deserialize, Serialize};
use super::{Coord, Direction};
@ -17,11 +19,11 @@ pub struct Request {
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
pub struct Game {
/// A unique identifier for this Game.
pub id: String,
pub id: Arc<str>,
/// Information about the ruleset being used to run this Game.
pub ruleset: Ruleset,
/// The name of the map being played on.
pub map: String,
pub map: Arc<str>,
/// How much time your snake has to respond to requests for this Game.
pub timeout: u16,
/// The source of this Game.
@ -31,15 +33,15 @@ pub struct Game {
/// - arena
/// - challenge
/// - custom
pub source: String,
pub source: Arc<str>,
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
pub struct Ruleset {
/// Name of the ruleset being used to run this game.
pub name: String,
pub name: Arc<str>,
/// The release version of the Rules module used in this game.
pub version: String,
pub version: Arc<str>,
/// A collection of specific settings being used by the current game that control how the rules
/// are applied.
pub settings: Settings,
@ -84,9 +86,9 @@ pub struct Board {
#[derive(Debug, PartialEq, Eq, Clone, Deserialize)]
pub struct Battlesnake {
/// Unique identifier for this Battlesnake in the context of the current Game.
pub id: String,
pub id: Arc<str>,
/// Name given to this Battlesnake by its author
pub name: String,
pub name: Arc<str>,
/// Health value of this Battlesnake, between 0 and 100
pub health: u8,
/// Array of coordinates representing the Battlesnake's location on the game board.
@ -94,7 +96,7 @@ pub struct Battlesnake {
pub body: Vec<Coord>,
/// The previous response time of this Battlesnake, in milliseconds.
/// If the Battlesnake timed out and failed to respond, the game timeout will be returned
pub latency: String,
pub latency: Arc<str>,
/// Coordinates for this Battlesnake's head.
/// Equivalent to the first element of the body array.
pub head: Coord,
@ -102,10 +104,10 @@ pub struct Battlesnake {
/// Equivalent to the length of the body array.
pub length: u16,
/// Message shouted by this Battlesnake on the previous turn
pub shout: String,
pub shout: Option<Arc<str>>,
/// The squad that the Battlesnake belongs to.
/// Used to identify squad members in Squad Mode games.
pub squad: String,
pub squad: Arc<str>,
}
#[derive(Debug, PartialEq, Eq, Clone, Serialize)]