chiark / gitweb /
Introduce and use PiceTrait downcaste_piece extension methoc
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 Apr 2022 15:43:44 +0000 (16:43 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 Apr 2022 15:43:44 +0000 (16:43 +0100)
This is more convenient.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/currency.rs
src/fastsplit.rs
src/gamestate.rs

index 8d6784a991d728b80bebb4c29eff714f34d16bb4..1dad79f60d410587bc15c887a8ef5f31f3352adc 100644 (file)
@@ -131,11 +131,10 @@ impl PieceTrait for Banknote {
   {
     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)
index 4a80c5ff2dc3708489a201d6c354d8363b7b1829..847d6a16d6de9f8c117d123521c2a767ae360c40 100644 (file)
@@ -136,12 +136,10 @@ impl InstanceGuard<'_> {
       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,
index ff2f0806eb3ce9a48b34f6f05b9e519ae8269e4f..57af8d30676dcbd251798dbb2b53c5a7dc155468 100644 (file)
@@ -421,6 +421,15 @@ impl Timestamp {
   }
 }
 
+#[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)]