chiark / gitweb /
utils: Break out [Index]Vec::ensure_element_with ext traits
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 10:22:19 +0000 (11:22 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 May 2021 10:22:19 +0000 (11:22 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bundles.rs
src/utils.rs

index 6c8af3513d825258e8db9b756fb97aed46a0edb2..7232ac29b33e204a19dfa848156f74fe56f34e05 100644 (file)
@@ -886,10 +886,7 @@ impl InstanceBundles {
         },
       };
 
-      let iu: usize = parsed.index().into();
-      if ib.bundles.get(iu).is_none() {
-        ib.bundles.resize_with(iu+1, default);
-      }
+      ib.bundles.ensure_element_with(parsed.index().into(), default);
 
       if_let!{ BundleSavefile::Bundle(id) = parsed;
                else continue; }
index fd2e530b6810dc26de42dde0e5f6792d3050ce39..335de872d18e7d733ab3fb458245f16fea6e9bd0 100644 (file)
@@ -623,3 +623,19 @@ impl<T: io::Seek> T {
   #[throws(io::Error)]
   fn rewind(&mut self) { self.seek(io::SeekFrom::Start(0))? }
 }
+
+#[ext(pub)]
+impl<T> Vec<T> {
+  fn ensure_element_with<F>(&mut self, i: usize, f: F) where F: FnMut() -> T {
+    if self.get(i).is_none() {
+      self.resize_with(i+1, f);
+    }
+  }
+}
+
+#[ext(pub)]
+impl<I,T> IndexVec<I,T> where I: index_vec::Idx {
+  fn ensure_element_with<F>(&mut self, i: I, f: F) where F: FnMut() -> T {
+    self.raw.ensure_element_with(i.index(), f)
+  }
+}