zng_wgt_wrap/
crate_util.rs

1use std::{mem, ops};
2
3pub(crate) trait Recycle: Default {
4    fn recycle(&mut self);
5}
6
7#[derive(Default)]
8pub(crate) struct RecycleVec<T: Recycle> {
9    vec: Vec<T>,
10    fresh_len: usize,
11}
12impl<T: Recycle> RecycleVec<T> {
13    pub fn begin_reuse(&mut self) {
14        self.fresh_len = 0;
15    }
16
17    pub fn commit_reuse(&mut self) {
18        self.vec.truncate(self.fresh_len);
19    }
20
21    pub fn new_item(&mut self) -> T {
22        if self.vec.len() > self.fresh_len {
23            let mut item = self.vec.pop().unwrap();
24            item.recycle();
25            item
26        } else {
27            T::default()
28        }
29    }
30
31    pub fn push(&mut self, item: T) {
32        if self.fresh_len == self.vec.len() {
33            self.vec.push(item);
34        } else {
35            let old = mem::replace(&mut self.vec[self.fresh_len], item);
36            self.vec.push(old);
37        }
38        self.fresh_len += 1;
39    }
40
41    pub fn push_renew(&mut self, item: &mut T) {
42        let new_item = self.new_item();
43        let item = mem::replace(item, new_item);
44        self.push(item);
45    }
46
47    pub fn iter_mut(&mut self) -> std::slice::IterMut<T> {
48        self.vec[..self.fresh_len].iter_mut()
49    }
50}
51impl<T: Recycle> ops::Deref for RecycleVec<T> {
52    type Target = [T];
53
54    fn deref(&self) -> &Self::Target {
55        &self.vec[..self.fresh_len]
56    }
57}
58impl<T: Recycle> ops::DerefMut for RecycleVec<T> {
59    fn deref_mut(&mut self) -> &mut Self::Target {
60        &mut self.vec[..self.fresh_len]
61    }
62}