posix_regex/
immut_vec.rs

1#[cfg(feature = "no_std")]
2use std::prelude::*;
3
4use std::cell::RefCell;
5
6pub struct ImmutVecItem<T> {
7    prev: Option<usize>,
8    data: T
9}
10pub struct ImmutVec<'a, T> {
11    inner: &'a RefCell<Vec<ImmutVecItem<T>>>,
12    id: Option<usize>
13}
14impl<'a, T> Copy for ImmutVec<'a, T> {}
15impl<'a, T> Clone for ImmutVec<'a, T> {
16    fn clone(&self) -> Self {
17        Self {
18            inner: self.inner,
19            id: self.id
20        }
21    }
22}
23impl<'a, T> ImmutVec<'a, T> {
24    pub fn new(inner: &'a RefCell<Vec<ImmutVecItem<T>>>) -> Self {
25        Self {
26            inner,
27            id: None
28        }
29    }
30    #[must_use = "push does nothing to the original vector"]
31    pub fn push(self, item: T) -> Self {
32        let mut inner = self.inner.borrow_mut();
33        let id = inner.len();
34        inner.push(ImmutVecItem {
35            prev: self.id,
36            data: item
37        });
38        Self {
39            id: Some(id),
40            ..self
41        }
42    }
43}
44impl<'a, T: Clone> ImmutVec<'a, T> {
45    #[must_use = "pop does nothing to the original vector"]
46    pub fn pop(self) -> (Self, Option<T>) {
47        let inner = self.inner.borrow();
48        let id = match self.id {
49            None => return (self, None),
50            Some(id) => id
51        };
52        let item = &inner[id];
53        (Self {
54            id: item.prev,
55            ..self
56        }, Some(item.data.clone()))
57    }
58    pub fn iter_rev(self) -> ImmutVecIter<'a, T> {
59        ImmutVecIter(self)
60    }
61}
62
63pub struct ImmutVecIter<'a, T: Clone>(ImmutVec<'a, T>);
64impl<'a, T: Clone> Iterator for ImmutVecIter<'a, T> {
65    type Item = T;
66
67    fn next(&mut self) -> Option<Self::Item> {
68        let (new, item) = self.0.pop();
69        self.0 = new;
70        item
71    }
72}