From: Ian Jackson Date: Thu, 20 May 2021 10:22:19 +0000 (+0100) Subject: utils: Break out [Index]Vec::ensure_element_with ext traits X-Git-Tag: otter-0.6.0~123 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=7875d6ed2c16ded8419e9e1bb237d5a6f759234b;p=otter.git utils: Break out [Index]Vec::ensure_element_with ext traits Signed-off-by: Ian Jackson --- diff --git a/src/bundles.rs b/src/bundles.rs index 6c8af351..7232ac29 100644 --- a/src/bundles.rs +++ b/src/bundles.rs @@ -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; } diff --git a/src/utils.rs b/src/utils.rs index fd2e530b..335de872 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -623,3 +623,19 @@ impl T { #[throws(io::Error)] fn rewind(&mut self) { self.seek(io::SeekFrom::Start(0))? } } + +#[ext(pub)] +impl Vec { + fn ensure_element_with(&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 IndexVec where I: index_vec::Idx { + fn ensure_element_with(&mut self, i: I, f: F) where F: FnMut() -> T { + self.raw.ensure_element_with(i.index(), f) + } +}