1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-04 02:24:12 +02:00

Own the strings instead of using Cows. May sacrifice a little bit of performance but makes it easier to live read the packets and update the state.

This commit is contained in:
Bash 2023-12-11 14:35:56 +11:00
commit 3639cc8ce1
2 changed files with 14 additions and 14 deletions

View file

@ -8,7 +8,7 @@ use crate::demo::data::{DemoTick, ServerTick};
use crate::demo::header::Header; use crate::demo::header::Header;
use crate::demo::packet::message::MessagePacketMeta; use crate::demo::packet::message::MessagePacketMeta;
use crate::ParserState; use crate::ParserState;
use std::borrow::Cow; use std::sync::Arc;
pub trait MessageHandler { pub trait MessageHandler {
type Output; type Output;
@ -65,27 +65,27 @@ impl MessageHandler for NullHandler {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct DemoHandler<'a, T: MessageHandler> { pub struct DemoHandler<T: MessageHandler> {
pub server_tick: ServerTick, pub server_tick: ServerTick,
pub demo_tick: DemoTick, pub demo_tick: DemoTick,
pub string_table_names: Vec<Cow<'a, str>>, pub string_table_names: Vec<Arc<str>>,
analyser: T, analyser: T,
pub state_handler: ParserState, pub state_handler: ParserState,
} }
impl<'a> DemoHandler<'a, NullHandler> { impl DemoHandler<NullHandler> {
pub fn new() -> Self { pub fn new() -> Self {
Self::parse_all_with_analyser(NullHandler) Self::parse_all_with_analyser(NullHandler)
} }
} }
impl<'a> Default for DemoHandler<'a, NullHandler> { impl Default for DemoHandler<NullHandler> {
fn default() -> Self { fn default() -> Self {
DemoHandler::new() DemoHandler::new()
} }
} }
impl<'a, T: MessageHandler> DemoHandler<'a, T> { impl<T: MessageHandler> DemoHandler<T> {
pub fn with_analyser(analyser: T) -> Self { pub fn with_analyser(analyser: T) -> Self {
let state_handler = ParserState::new(24, T::does_handle, false); let state_handler = ParserState::new(24, T::does_handle, false);
@ -114,7 +114,7 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
self.analyser.handle_header(header); self.analyser.handle_header(header);
} }
pub fn handle_packet(&mut self, packet: Packet<'a>) -> Result<()> { pub fn handle_packet(&mut self, packet: Packet) -> Result<()> {
match packet { match packet {
Packet::DataTables(packet) => { Packet::DataTables(packet) => {
self.handle_data_table(packet.tables, packet.server_classes)?; self.handle_data_table(packet.tables, packet.server_classes)?;
@ -151,7 +151,7 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
Ok(()) Ok(())
} }
fn handle_string_table(&mut self, table: StringTable<'a>) { fn handle_string_table(&mut self, table: StringTable) {
self.state_handler self.state_handler
.handle_string_table_meta(table.get_table_meta()); .handle_string_table_meta(table.get_table_meta());
for (entry_index, entry) in table.entries.into_iter() { for (entry_index, entry) in table.entries.into_iter() {
@ -166,10 +166,10 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
); );
} }
self.string_table_names.push(table.name); self.string_table_names.push(table.name.into());
} }
fn handle_table_update(&mut self, table_id: u8, entries: Vec<(u16, StringTableEntry<'a>)>) { fn handle_table_update(&mut self, table_id: u8, entries: Vec<(u16, StringTableEntry)>) {
if let Some(table_name) = self.string_table_names.get(table_id as usize) { if let Some(table_name) = self.string_table_names.get(table_id as usize) {
for (index, entry) in entries { for (index, entry) in entries {
let index = index as usize; let index = index as usize;
@ -192,7 +192,7 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
.handle_data_table(send_tables, server_classes) .handle_data_table(send_tables, server_classes)
} }
pub fn handle_message(&mut self, message: Message<'a>, tick: DemoTick) { pub fn handle_message(&mut self, message: Message, tick: DemoTick) {
let message_type = message.get_message_type(); let message_type = message.get_message_type();
if T::does_handle(message_type) { if T::does_handle(message_type) {
self.analyser self.analyser
@ -210,7 +210,7 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
} }
} }
impl<T: MessageHandler + BorrowMessageHandler> DemoHandler<'_, T> { impl<T: MessageHandler + BorrowMessageHandler> DemoHandler<T> {
pub fn borrow_output(&self) -> &T::Output { pub fn borrow_output(&self) -> &T::Output {
self.analyser.borrow_output(&self.state_handler) self.analyser.borrow_output(&self.state_handler)
} }

View file

@ -58,7 +58,7 @@ impl<'a, T: BitRead<'a, LittleEndian>> ParseBitSkip<'a> for T {
} }
pub struct DemoParser<'a, A: MessageHandler> { pub struct DemoParser<'a, A: MessageHandler> {
handler: DemoHandler<'a, A>, handler: DemoHandler<A>,
stream: Stream<'a>, stream: Stream<'a>,
} }
@ -154,7 +154,7 @@ impl<'a> RawPacketStream<'a> {
#[derive(Clone)] #[derive(Clone)]
pub struct DemoTicker<'a, A: MessageHandler> { pub struct DemoTicker<'a, A: MessageHandler> {
handler: DemoHandler<'a, A>, handler: DemoHandler<A>,
packets: RawPacketStream<'a>, packets: RawPacketStream<'a>,
} }