From: Ian Jackson Date: Wed, 17 Mar 2021 01:38:12 +0000 (+0000) Subject: xdata: Pass default function into get_mut etc. X-Git-Tag: otter-0.5.0~699 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=653d47980cbfe07c3081cc04036696501070c8b6;p=otter.git xdata: Pass default function into get_mut etc. Signed-off-by: Ian Jackson --- 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);