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}