chiark / gitweb /
xdata: Pass default function into get_mut etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 17 Mar 2021 01:38:12 +0000 (01:38 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 19 Mar 2021 20:02:31 +0000 (20:02 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs
src/hand.rs

index 6da5d2f9595e46ba650c621a4be465bc262272e8..426f62320778b6859be74f70644d33aac0f809da 100644 (file)
@@ -284,8 +284,11 @@ impl GPiece {
   }
 
   #[throws(IE)]
-  pub fn xdata_mut<T:PieceXData+Default>(&mut self) -> &mut T {
-    self.xdata.get_mut()?
+  pub fn xdata_mut<
+      T: PieceXData + Default,
+      D: FnOnce() -> T,
+  >(&mut self, def: D) -> &mut T {
+    self.xdata.get_mut(def)?
   }
 
   pub fn dummy() -> Self {
@@ -326,8 +329,11 @@ impl PieceXDataState {
     else { throw!(xdata_unexpected::<T>(xdata)) }
   }
 
-  fn get_mut<T:PieceXData+Default>(&mut self) -> Result<&mut T, IE> {
-    let xdata = self.get_or_insert_with(|| <T as PieceXData>::default());
+  fn get_mut<
+      T: PieceXData+Default,
+      D: FnOnce() -> T,
+  >(&mut self, def: D) -> Result<&mut T, IE> {
+    let xdata = self.get_or_insert_with(|| Box::new(def()));
     let xdata: &mut dyn PieceXData = xdata.as_mut();
     let keep: *mut dyn PieceXData = xdata;
     if let Some(y) = xdata.downcast_mut::<T>() { return Ok(y) }
index 27eee032a9e94907ed21e2f4220a9519a380c9e6..f0a506c259fb2df9dd91a68c5fe4db2429544c79 100644 (file)
@@ -146,7 +146,7 @@ impl PieceTrait for Hand {
 
     let goccults = &mut gs.occults;
     let gpc = gpieces.byid_mut(piece)?;
-    let xdata = gpc.xdata.get_mut::<HandState>()
+    let xdata = gpc.xdata.get_mut::<HandState,_>(default)
       .map_err(|e| APOE::ReportViaResponse(e.into()))?;
     let old_desc = self.describe_html_inner(Some(xdata));
     let old_player = xdata.player();
@@ -227,7 +227,8 @@ impl PieceTrait for Hand {
     // We need to reaquire mut references because create_occultation etc.
     // need mut access to gpieces.
     let gpc = gpieces.byid_mut(piece).expect("piece disappeared");
-    let xdata = gpc.xdata.get_mut::<HandState>().expect("xdata disappeared!");
+    let xdata = gpc.xdata.get_mut::<HandState,_>(default)
+      .expect("xdata disappeared!");
     assert_eq!(xdata.player(), old_player);
 
     dbgc!("thinging done", &xdata, &new_owner);