From 653d47980cbfe07c3081cc04036696501070c8b6 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 17 Mar 2021 01:38:12 +0000 Subject: [PATCH] xdata: Pass default function into get_mut etc. Signed-off-by: Ian Jackson --- src/gamestate.rs | 14 ++++++++++---- src/hand.rs | 5 +++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gamestate.rs b/src/gamestate.rs index 6da5d2f9..426f6232 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -284,8 +284,11 @@ impl GPiece { } #[throws(IE)] - pub fn xdata_mut(&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::(xdata)) } } - fn get_mut(&mut self) -> Result<&mut T, IE> { - let xdata = self.get_or_insert_with(|| ::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::() { return Ok(y) } diff --git a/src/hand.rs b/src/hand.rs index 27eee032..f0a506c2 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -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::() + let xdata = gpc.xdata.get_mut::(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::().expect("xdata disappeared!"); + let xdata = gpc.xdata.get_mut::(default) + .expect("xdata disappeared!"); assert_eq!(xdata.player(), old_player); dbgc!("thinging done", &xdata, &new_owner); -- 2.30.2