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

optimize should_parse_message

This commit is contained in:
Robin Appelman 2019-03-17 18:54:53 +01:00
commit f4e4f2e26b
4 changed files with 14 additions and 18 deletions

View file

@ -59,7 +59,7 @@ impl Parse for MessagePacket {
while packet_data.bits_left() > 6 { while packet_data.bits_left() > 6 {
let message_type = MessageType::parse(&mut packet_data, state)?; let message_type = MessageType::parse(&mut packet_data, state)?;
if state.parse_message_types.contains(&message_type) { if state.should_parse_message(message_type) {
let message = Message::from_type(message_type, &mut packet_data, state)?; let message = Message::from_type(message_type, &mut packet_data, state)?;
messages.push(message); messages.push(message);
} else { } else {

View file

@ -176,7 +176,7 @@ pub struct Analyser {
} }
impl MessageHandler for Analyser { impl MessageHandler for Analyser {
fn does_handle(&self, message_type: MessageType) -> bool { fn does_handle(message_type: MessageType) -> bool {
match message_type { match message_type {
MessageType::GameEvent | MessageType::UserMessage => true, MessageType::GameEvent | MessageType::UserMessage => true,
_ => false, _ => false,

View file

@ -6,7 +6,7 @@ use crate::demo::parser::analyser::{Analyser, MatchState};
use crate::ParserState; use crate::ParserState;
pub trait MessageHandler { pub trait MessageHandler {
fn does_handle(&self, message_type: MessageType) -> bool; fn does_handle(message_type: MessageType) -> bool;
fn handle_message(&mut self, message: Message, tick: u32); fn handle_message(&mut self, message: Message, tick: u32);
} }
@ -25,15 +25,14 @@ pub struct DemoHandler {
impl DemoHandler { impl DemoHandler {
pub fn new() -> Self { pub fn new() -> Self {
let mut state = ParserState::new();
let analyser = Analyser::new(); let analyser = Analyser::new();
state.parse_message_types.extend(analyser.get_message_types()); let state_handler = ParserState::new();
DemoHandler { DemoHandler {
tick: 0, tick: 0,
string_table_names: Vec::new(), string_table_names: Vec::new(),
analyser, analyser,
state_handler: state, state_handler,
} }
} }
@ -101,11 +100,11 @@ impl DemoHandler {
fn handle_message(&mut self, message: Message) { fn handle_message(&mut self, message: Message) {
let message_type = message.get_message_type(); let message_type = message.get_message_type();
if self.state_handler.does_handle(message_type) { if ParserState::does_handle(message_type) {
self.state_handler.handle_message(message, self.tick); self.state_handler.handle_message(message, self.tick);
return; return;
} }
if self.analyser.does_handle(message_type) { if Analyser::does_handle(message_type) {
self.analyser.handle_message(message, self.tick); self.analyser.handle_message(message, self.tick);
return; return;
} }

View file

@ -10,6 +10,7 @@ use crate::demo::packet::stringtable::StringTableEntry;
use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler}; use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler};
use crate::demo::sendprop::SendProp; use crate::demo::sendprop::SendProp;
use crate::Stream; use crate::Stream;
use crate::demo::parser::analyser::Analyser;
#[derive(Default)] #[derive(Default)]
pub struct DemoMeta { pub struct DemoMeta {
@ -28,7 +29,6 @@ pub struct ParserState {
pub server_classes: Vec<ServerClass>, pub server_classes: Vec<ServerClass>,
pub instance_baselines: [HashMap<EntityId, Vec<SendProp>>; 2], pub instance_baselines: [HashMap<EntityId, Vec<SendProp>>; 2],
pub demo_meta: DemoMeta, pub demo_meta: DemoMeta,
pub parse_message_types: Vec<MessageType>,
} }
pub struct StaticBaseline { pub struct StaticBaseline {
@ -49,14 +49,7 @@ impl StaticBaseline {
impl ParserState { impl ParserState {
pub fn new() -> Self { pub fn new() -> Self {
let mut state = ParserState::default(); ParserState::default()
state.parse_message_types.extend_from_slice(&[
MessageType::ServerInfo,
MessageType::GameEventList,
MessageType::CreateStringTable,
MessageType::UpdateStringTable
]);
state
} }
pub fn handle_data_table( pub fn handle_data_table(
@ -73,10 +66,14 @@ impl ParserState {
pub fn handle_string_table_meta(&mut self, table: StringTableMeta) { pub fn handle_string_table_meta(&mut self, table: StringTableMeta) {
self.string_tables.push(table); self.string_tables.push(table);
} }
pub fn should_parse_message(&self, message_type: MessageType) -> bool {
Self::does_handle(message_type) || Analyser::does_handle(message_type)
}
} }
impl MessageHandler for ParserState { impl MessageHandler for ParserState {
fn does_handle(&self, message_type: MessageType) -> bool { fn does_handle(message_type: MessageType) -> bool {
match message_type { match message_type {
MessageType::ServerInfo MessageType::ServerInfo
| MessageType::GameEventList | MessageType::GameEventList