From: Ian Jackson Date: Mon, 1 Mar 2021 18:22:45 +0000 (+0000) Subject: hidden vpid: Make into a module X-Git-Tag: otter-0.4.0~257 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=825009fbe9119b34b930ee6d343b2dda30380066;p=otter.git hidden vpid: Make into a module This will hide our new id management algorithm Signed-off-by: Ian Jackson --- diff --git a/src/hidden.rs b/src/hidden.rs index a03d27b1..1705e15e 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -130,51 +130,57 @@ impl GameOccults { // ========== PerPlayerIdMap ========== -#[derive(Clone,Debug,Default,Serialize,Deserialize)] -pub struct PerPlayerIdMap { - f: SecondarySlotMap, - r: DenseSlotMap, -} +mod vpid { + use super::*; -impl PerPlayerIdMap { - pub fn fwd(&self, piece: PieceId) -> Option { - Some(*self.f.get(piece)?) - } - pub fn rev(&self, vis: VisiblePieceId) -> Option { - Some(*self.r.get(vis)?) + #[derive(Clone,Debug,Default,Serialize,Deserialize)] + pub struct PerPlayerIdMap { + f: SecondarySlotMap, + r: DenseSlotMap, } - fn fwd_or_insert_internal - (&mut self, piece: PieceId, vf: VF, of: OF) -> R - where VF: FnOnce(VisiblePieceId) -> R, - OF: FnOnce(secondary::OccupiedEntry) -> R, - { - match self.f.entry(piece).expect("stale PieceId !") { - secondary::Entry::Vacant(mut vac) => { - if let Some((_, stale_vis)) = vac.remove_stale_entry() { - self.r.remove(stale_vis); + impl PerPlayerIdMap { + pub fn fwd(&self, piece: PieceId) -> Option { + Some(*self.f.get(piece)?) + } + pub fn rev(&self, vis: VisiblePieceId) -> Option { + Some(*self.r.get(vis)?) + } + + fn fwd_or_insert_internal + (&mut self, piece: PieceId, vf: VF, of: OF) -> R + where VF: FnOnce(VisiblePieceId) -> R, + OF: FnOnce(secondary::OccupiedEntry) -> R, + { + match self.f.entry(piece).expect("stale PieceId !") { + secondary::Entry::Vacant(mut vac) => { + if let Some((_, stale_vis)) = vac.remove_stale_entry() { + self.r.remove(stale_vis); + } + let vis = self.r.insert(piece); + vac.insert(vis); + vf(vis) + } + secondary::Entry::Occupied(occ) => { + of(occ) } - let vis = self.r.insert(piece); - vac.insert(vis); - vf(vis) - } - secondary::Entry::Occupied(occ) => { - of(occ) } } - } - pub fn insert(&mut self, piece: PieceId) { - self.fwd_or_insert_internal(piece, |_vis|(), |vis|{ - panic!("duplicate insert of {:?} {:?}", piece, vis) - }) - } + pub fn insert(&mut self, piece: PieceId) { + self.fwd_or_insert_internal(piece, |_vis|(), |vis|{ + panic!("duplicate insert of {:?} {:?}", piece, vis) + }) + } - pub fn fwd_or_insert(&mut self, piece: PieceId) -> VisiblePieceId { - self.fwd_or_insert_internal(piece, |vis|vis, |occ| *occ.get()) + pub fn fwd_or_insert(&mut self, piece: PieceId) -> VisiblePieceId { + self.fwd_or_insert_internal(piece, |vis|vis, |occ| *occ.get()) + } } } +pub use vpid::*; + // ========== public entrypoints ========== /// None => do not render at all