// ========== PerPlayerIdMap ==========
-#[derive(Clone,Debug,Default,Serialize,Deserialize)]
-pub struct PerPlayerIdMap {
- f: SecondarySlotMap<PieceId, VisiblePieceId>,
- r: DenseSlotMap<VisiblePieceId, PieceId>,
-}
+mod vpid {
+ use super::*;
-impl PerPlayerIdMap {
- pub fn fwd(&self, piece: PieceId) -> Option<VisiblePieceId> {
- Some(*self.f.get(piece)?)
- }
- pub fn rev(&self, vis: VisiblePieceId) -> Option<PieceId> {
- Some(*self.r.get(vis)?)
+ #[derive(Clone,Debug,Default,Serialize,Deserialize)]
+ pub struct PerPlayerIdMap {
+ f: SecondarySlotMap<PieceId, VisiblePieceId>,
+ r: DenseSlotMap<VisiblePieceId, PieceId>,
}
- fn fwd_or_insert_internal<R, VF, OF>
- (&mut self, piece: PieceId, vf: VF, of: OF) -> R
- where VF: FnOnce(VisiblePieceId) -> R,
- OF: FnOnce(secondary::OccupiedEntry<PieceId,VisiblePieceId>) -> 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<VisiblePieceId> {
+ Some(*self.f.get(piece)?)
+ }
+ pub fn rev(&self, vis: VisiblePieceId) -> Option<PieceId> {
+ Some(*self.r.get(vis)?)
+ }
+
+ fn fwd_or_insert_internal<R, VF, OF>
+ (&mut self, piece: PieceId, vf: VF, of: OF) -> R
+ where VF: FnOnce(VisiblePieceId) -> R,
+ OF: FnOnce(secondary::OccupiedEntry<PieceId,VisiblePieceId>) -> 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