This is more convenient.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
{
ig.fastsplit_split(player, tpiece, show, new_z,
move |_: &IOccults, _: &GameOccults, gpl: &GPlayer,
- tgpc: &mut GPiece, tipc: &IPiece, tipc_p: &dyn PieceTrait,
+ tgpc: &mut GPiece, _tipc: &IPiece, tipc_p: &dyn PieceTrait,
ngpc: &mut GPiece|
{
- let self_: &Banknote = tipc_p.downcast_ref::<Banknote>()
- .ok_or_else(|| internal_error_bydebug(tipc))?;
+ let self_: &Banknote = tipc_p.downcast_piece()?;
let tgpc_value: &mut Value = tgpc.xdata.get_mut_exp()?;
let remaining = tgpc_value.qty.checked_sub(take)
fastsplit: tgpc.fastsplit,
};
- let tipc_p = (||{
- let p = tipc.p.show(show);
- let p: &Piece = p.downcast_ref::<Piece>()?;
- let p = p.ipc.as_ref()?.p.show(show);
- Some(p)
- })().ok_or_else(|| internal_error_bydebug(tipc))?;
+ let tipc_p = tipc.p
+ .show(show).downcast_piece::<Piece>()?
+ .ipc.as_ref().ok_or_else(|| internal_error_bydebug(tipc))?
+ .p.show(show);
let (t_pu, t_unprepared) = implementation(
&ig.ioccults, &ig.gs.occults, gpl,
}
}
+#[ext(pub)]
+impl<'r> &'r dyn PieceTrait {
+ #[throws(IE)]
+ fn downcast_piece<P: PieceTrait>(self) -> &'r P {
+ self.downcast_ref::<P>().ok_or_else(|| internal_logic_error(format!(
+ "downcaste_piece failure! got: {:?}", &self)))?
+ }
+}
+
// ---------- positions and ClampTable ----------
#[derive(Error,Debug,Copy,Clone)]