use crate::dispatch::{BuiltinReposition, BuiltinStrategy, DispatchStrategy, RepositionStrategy};
use crate::ids::GroupId;
use std::collections::BTreeMap;
pub struct DispatcherSet {
strategies: BTreeMap<GroupId, Box<dyn DispatchStrategy>>,
ids: BTreeMap<GroupId, BuiltinStrategy>,
}
impl DispatcherSet {
pub fn from_parts(
strategies: BTreeMap<GroupId, Box<dyn DispatchStrategy>>,
ids: BTreeMap<GroupId, BuiltinStrategy>,
) -> Self {
debug_assert!(
strategies.keys().eq(ids.keys()),
"DispatcherSet::from_parts: strategies and ids must have identical key sets"
);
Self { strategies, ids }
}
pub fn insert(
&mut self,
group: GroupId,
strategy: Box<dyn DispatchStrategy>,
id: BuiltinStrategy,
) {
self.strategies.insert(group, strategy);
self.ids.insert(group, id);
}
pub fn id_for(&self, group: GroupId) -> Option<&BuiltinStrategy> {
self.ids.get(&group)
}
pub const fn strategies(&self) -> &BTreeMap<GroupId, Box<dyn DispatchStrategy>> {
&self.strategies
}
pub const fn strategies_mut(&mut self) -> &mut BTreeMap<GroupId, Box<dyn DispatchStrategy>> {
&mut self.strategies
}
}
pub struct RepositionerSet {
strategies: BTreeMap<GroupId, Box<dyn RepositionStrategy>>,
ids: BTreeMap<GroupId, BuiltinReposition>,
}
impl Default for RepositionerSet {
fn default() -> Self {
Self::new()
}
}
impl RepositionerSet {
pub const fn new() -> Self {
Self {
strategies: BTreeMap::new(),
ids: BTreeMap::new(),
}
}
pub fn from_parts(
strategies: BTreeMap<GroupId, Box<dyn RepositionStrategy>>,
ids: BTreeMap<GroupId, BuiltinReposition>,
) -> Self {
debug_assert!(
strategies.keys().eq(ids.keys()),
"RepositionerSet::from_parts: strategies and ids must have identical key sets"
);
Self { strategies, ids }
}
pub fn insert(
&mut self,
group: GroupId,
strategy: Box<dyn RepositionStrategy>,
id: BuiltinReposition,
) {
self.strategies.insert(group, strategy);
self.ids.insert(group, id);
}
pub fn remove(&mut self, group: GroupId) {
self.strategies.remove(&group);
self.ids.remove(&group);
}
pub fn id_for(&self, group: GroupId) -> Option<&BuiltinReposition> {
self.ids.get(&group)
}
pub fn is_empty(&self) -> bool {
self.strategies.is_empty()
}
pub fn contains_key(&self, group: GroupId) -> bool {
self.strategies.contains_key(&group)
}
pub const fn strategies_mut(&mut self) -> &mut BTreeMap<GroupId, Box<dyn RepositionStrategy>> {
&mut self.strategies
}
}