chiark / gitweb /
xdata: Split out xdata_get_mut_inner
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 19 Mar 2021 00:34:38 +0000 (00:34 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 20 Mar 2021 20:12:41 +0000 (20:12 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs

index a66ca304a05350dc95604a04541adf71491fdd1f..f7651498d21d2171c48cf94f3676a8d57cd07cc0 100644 (file)
@@ -358,21 +358,27 @@ impl PieceXDataState {
       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) }
-    
-    // Erroneous borrowck error with early returns
-    // https://github.com/rust-lang/rust/issues/58910
-    // https://github.com/rust-lang/rust/issues/51545
-    // Safety: the `xdata` borrow that was passed to `downcast_mut`
-    // is no longer present in this branch, so now we have only `keep`
-    // and the things `keep` was borrowed from.
-    let xdata: &dyn PieceXData = unsafe { keep.as_ref().unwrap() };
-    Err(xdata_unexpected::<T>(xdata))
+    xdata_get_mut_inner(xdata)
   }
 }
 
+fn xdata_get_mut_inner<
+  T: PieceXData,
+>(xdata: &mut Box<dyn PieceXData>) -> Result<&mut T, IE> {
+  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) }
+    
+  // Erroneous borrowck error with early returns
+  // https://github.com/rust-lang/rust/issues/58910
+  // https://github.com/rust-lang/rust/issues/51545
+  // Safety: the `xdata` borrow that was passed to `downcast_mut`
+  // is no longer present in this branch, so now we have only `keep`
+  // and the things `keep` was borrowed from.
+  let xdata: &dyn PieceXData = unsafe { keep.as_ref().unwrap() };
+  Err(xdata_unexpected::<T>(xdata))
+}
+
 impl GameState {
   pub fn dummy() -> Self { GameState {
     table_colour: Html::lit("green"),