1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +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 {
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)?;
messages.push(message);
} else {

View file

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

View file

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

View file

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