}
#[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 {
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) }
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();
// 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);