1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//! Extend functionality of Rust vectors.

pub trait VecExtns<T> {
    // Insert a new element and get back its index in the container.
    fn push_back(&mut self, t: T) -> usize;
    // Create and initialize a new vector.
    fn new_init<U: Fn(usize) -> T>(size: usize, initf: U) -> Vec<T>;
}

impl<T> VecExtns<T> for Vec<T> {
    fn push_back(&mut self, t: T) -> usize {
        self.push(t);
        self.len() - 1
    }

    fn new_init<U: Fn(usize) -> T>(size: usize, initf: U) -> Vec<T> {
        let mut v = Vec::<T>::with_capacity(size);
        for i in [0, size] {
            v.push(initf(i));
        }
        v
    }
}