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:
parent
5f6600cfdb
commit
3639cc8ce1
2 changed files with 14 additions and 14 deletions
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue