use std::{collections::HashMap, sync::{self, Arc, RwLock, mpsc}};
use anyhow::Result;
use rand_xoshiro::Xoshiro256PlusPlus;
use crate::runtime::{InteractionID, ParticleBorrowMut, ParticleID, Runtime};
use super::{CallbackMessage, analysis::BarrierID, analysis::{SimulationGraph, SymbolTable}, neighbors::NeighborList, util};
pub struct GlobalContext {
pub(crate) runtime: Runtime,
pub(crate) global_symbols: SymbolTable<()>,
pub(crate) simgraph: SimulationGraph,
}
#[derive(Clone)]
pub(crate) struct ExecutorContext {
pub(crate) barriers: HashMap<BarrierID, Arc<sync::Barrier>>,
pub(crate) step_barrier: Arc<sync::Barrier>,
pub(crate) step_counter: Arc<RwLock<usize>>,
pub(crate) call_end_barrier: Arc<sync::Barrier>,
pub(crate) call_sender: mpsc::Sender<CallbackMessage>,
pub(crate) neighbor_lists: HashMap<InteractionID, Arc<RwLock<NeighborList>>>,
pub(crate) global_context: Arc<GlobalContext>
}
pub(crate) struct ThreadContext {
pub(crate) particle_id: ParticleID,
pub(crate) particle_range: util::IndexRange,
pub(crate) rng: Xoshiro256PlusPlus,
pub(crate) normal_dist: rand_distr::Normal<f64>,
pub(crate) executor_context: ExecutorContext,
}
impl GlobalContext {
pub fn borrow_particle_mut(&self, particle_name: &str) -> Result<ParticleBorrowMut> {
self.runtime.borrow_particle_mut(particle_name)
}
}