MGI::DeletePiece(piece) => {
let (ig, modperm, _) = cs.check_acl_modify_pieces(ag, ig)?;
- let p = ig.ipieces.as_mut(modperm)
+ let IPiece { p } = ig.ipieces.as_mut(modperm)
.remove(piece).ok_or(ME::PieceNotFound)?;
let gs = &mut ig.gs;
let gpc = gs.pieces.as_mut(modperm).remove(piece);
pc.pos.clamped(gs.table_size).map_err(|_| SpecError::PosOffTable)?;
if pc.zlevel.z > gs.max_z { gs.max_z = pc.zlevel.z.clone() }
let piece = gs.pieces.as_mut(modperm).insert(pc);
- ig.ipieces.as_mut(modperm).insert(piece, p);
+ ig.ipieces.as_mut(modperm).insert(piece, IPiece { p });
updates.push((piece, PieceUpdateOp::Insert(())));
pos = (pos + posd)?;
}
pub tz: Timezone,
}
+#[derive(Debug,Serialize,Deserialize)]
+pub struct IPiece {
+ #[serde(flatten)]
+ pub p: Box<dyn PieceTrait>,
+}
+
#[derive(Debug,Serialize,Deserialize)]
#[serde(transparent)]
pub struct IPieces(ActualIPieces);
-pub type ActualIPieces = SecondarySlotMap<PieceId, Box<dyn PieceTrait>>;
+pub type ActualIPieces = SecondarySlotMap<PieceId, IPiece>;
#[derive(Copy,Clone,Debug)]
pub struct ModifyingPieces(());
impl IPieces {
pub fn get(&self, piece: PieceId) -> Option<&Box<dyn PieceTrait>> {
+ Some(&self.0.get(piece)?.p)
+ }
+
+ pub fn get_ipc(&self, piece: PieceId) -> Option<&IPiece> {
self.0.get(piece)
}