use std::{any::Any, slice::IterMut};
use crate::{process::config::AbstractProcessConfiguration, queue::{priorities::GenericProcessPriorities, strategy::QueueSearchStrategy}};
use super::filter::GenericFiltersManager;
pub trait AbstractProcessLogger<Conf : AbstractProcessConfiguration> {
fn as_any(&self) -> &dyn Any;
fn log_initialize(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
strategy : &QueueSearchStrategy,
priorities : &GenericProcessPriorities<Conf::Priorities>,
filters_manager : &GenericFiltersManager<Conf>,
initial_global_state : &Conf::MutablePersistentState,
use_memoization : bool,
);
fn log_new_node(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
new_node_id : u32,
new_node : &Conf::DomainSpecificNode
);
fn log_new_step(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
origin_node_id : u32,
step : &Conf::DomainSpecificStep,
target_node_id : u32,
target_node : &Conf::DomainSpecificNode
);
fn log_notify_last_child_step_of_node_processed(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
parent_node_id : u32
);
fn log_notify_node_without_children(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
node_id : u32
);
fn log_filtered(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
parent_node_id : u32,
filtration_result_id : u32,
filtration_result : &Conf::FiltrationResult
);
fn log_terminate_process(
&mut self,
context_and_param : &Conf::ContextAndParameterization,
global_state : &Conf::MutablePersistentState
);
}
pub(crate) fn loggers_initialize<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
strategy : &QueueSearchStrategy,
priorities : &GenericProcessPriorities<Conf::Priorities>,
filters_manager : &GenericFiltersManager<Conf>,
initial_global_state : &Conf::MutablePersistentState,
use_memoization : bool
) {
for logger in loggers_iter {
logger.log_initialize(
context_and_param,
strategy,
priorities,
filters_manager,
initial_global_state,
use_memoization
);
}
}
pub(crate) fn loggers_new_node<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
new_node_id : u32,
new_node : &Conf::DomainSpecificNode
) {
for logger in loggers_iter {
logger.log_new_node(
context_and_param,
new_node_id,
new_node
);
}
}
pub(crate) fn loggers_new_step<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
origin_node_id : u32,
step : &Conf::DomainSpecificStep,
target_node_id : u32,
target_node : &Conf::DomainSpecificNode
) {
for logger in loggers_iter {
logger.log_new_step(
context_and_param,
origin_node_id,
step,
target_node_id,
target_node
);
}
}
pub(crate) fn loggers_notify_last_child_step_of_node_processed<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
parent_node_id : u32
) {
for logger in loggers_iter {
logger.log_notify_last_child_step_of_node_processed(
context_and_param,
parent_node_id
);
}
}
pub(crate) fn loggers_notify_node_without_children<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
node_id : u32
) {
for logger in loggers_iter {
logger.log_notify_node_without_children(
context_and_param,
node_id
);
}
}
pub(crate) fn loggers_filtered<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
parent_node_id : u32,
filtration_result_id : u32,
filtration_result : &Conf::FiltrationResult
) {
for logger in loggers_iter {
logger.log_filtered(
context_and_param,
parent_node_id,
filtration_result_id,
filtration_result
);
}
}
pub(crate) fn loggers_terminate_process<Conf : AbstractProcessConfiguration>(
loggers_iter : IterMut<'_, Box< dyn AbstractProcessLogger<Conf>>>,
context_and_param : &Conf::ContextAndParameterization,
global_state : &Conf::MutablePersistentState
) {
for logger in loggers_iter {
logger.log_terminate_process(
context_and_param,
global_state
);
}
}