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 # server
tokio = { version = "1.43", features = ["net", "macros", "rt-multi-thread"] } tokio = { version = "1.43", features = ["net", "macros", "rt-multi-thread"] }
axum = { version = "0.8", features = ["http2", "multipart", "ws"] } axum = { version = "0.8", features = ["http2", "multipart", "ws"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive", "rc"] }
# logging # logging
log = "0.4" 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}; 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 { fn create_start_snake(coord: Coord) -> Battlesnake {
let id = format!("{coord:?}"); let id: Arc<str> = format!("{coord:?}").into();
Battlesnake { Battlesnake {
id: id.clone(), id: id.clone(),
name: id.clone(), name: id.clone(),
@ -18,7 +21,7 @@ fn create_start_snake(coord: Coord) -> Battlesnake {
latency: "0".into(), latency: "0".into(),
head: coord, head: coord,
length: 3, length: 3,
shout: String::new(), shout: None,
squad: id, squad: id,
} }
} }

View File

@ -3,6 +3,7 @@ use std::{
fmt::Display, fmt::Display,
num::NonZeroUsize, num::NonZeroUsize,
ops::{Deref, DerefMut}, ops::{Deref, DerefMut},
sync::Arc,
}; };
use bitvec::prelude::*; use bitvec::prelude::*;
@ -70,6 +71,7 @@ pub struct Board {
free: SmallBitBox, free: SmallBitBox,
snakes: Vec<Snake>, snakes: Vec<Snake>,
constrictor: bool, constrictor: bool,
id_map: Arc<[(u8, Arc<str>)]>,
} }
impl From<&Request> for Board { impl From<&Request> for Board {
@ -77,6 +79,18 @@ impl From<&Request> for Board {
let width = value.board.width; let width = value.board.width;
let height = value.board.height; let height = value.board.height;
let fields = usize::from(width) * usize::from(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 { let mut board = Self {
width, width,
height, height,
@ -88,7 +102,8 @@ impl From<&Request> for Board {
hazard: SmallBitBox::new(false, fields), hazard: SmallBitBox::new(false, fields),
free: SmallBitBox::new(true, fields), free: SmallBitBox::new(true, fields),
snakes: Vec::with_capacity(value.board.snakes.len()), 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 { for &food in &value.board.food {

View File

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