evobench_tools/utillib/
auto_vivify.rs

1pub trait AutoVivify<T> {
2    fn auto_get_mut<F>(&mut self, i: usize, gen_val: F) -> &mut T
3    where
4        F: FnMut() -> T;
5}
6
7impl<T> AutoVivify<T> for Vec<T> {
8    #[inline]
9    fn auto_get_mut<'s, F>(&'s mut self, i: usize, gen_val: F) -> &'s mut T
10    where
11        F: FnMut() -> T,
12    {
13        if let Some(rf) = self.get_mut(i) {
14            // Need hack for this well-known borrow checker issue
15            let ptr: *mut T = rf;
16            let rf: &mut T = unsafe {
17                // Safe because life time 's is valid for it.
18                &mut *ptr
19            };
20            rf
21        } else {
22            self.resize_with(i + 1, gen_val);
23            &mut self[i]
24        }
25    }
26}