Skip to main content

proc_macro2/
rcvec.rs

1// SPDX-License-Identifier: Apache-2.0 OR MIT
2
3use alloc::rc::Rc;
4use alloc::vec;
5use core::mem;
6use core::panic::RefUnwindSafe;
7use core::slice;
8
9pub(crate) struct RcVec<T> {
10    inner: Rc<Vec<T>>,
11}
12
13pub(crate) struct RcVecBuilder<T> {
14    inner: Vec<T>,
15}
16
17pub(crate) struct RcVecMut<'a, T> {
18    inner: &'a mut Vec<T>,
19}
20
21#[derive(Clone)]
22pub(crate) struct RcVecIntoIter<T> {
23    inner: vec::IntoIter<T>,
24}
25
26impl<T> RcVec<T> {
27    pub(crate) fn is_empty(&self) -> bool {
28        self.inner.is_empty()
29    }
30
31    pub(crate) fn len(&self) -> usize {
32        self.inner.len()
33    }
34
35    pub(crate) fn iter(&self) -> slice::Iter<T> {
36        self.inner.iter()
37    }
38
39    pub(crate) fn make_mut(&mut self) -> RcVecMut<T>
40    where
41        T: Clone,
42    {
43        RcVecMut {
44            inner: Rc::make_mut(&mut self.inner),
45        }
46    }
47
48    pub(crate) fn get_mut(&mut self) -> Option<RcVecMut<T>> {
49        let inner = Rc::get_mut(&mut self.inner)?;
50        Some(RcVecMut { inner })
51    }
52
53    pub(crate) fn make_owned(mut self) -> RcVecBuilder<T>
54    where
55        T: Clone,
56    {
57        let vec = if let Some(owned) = Rc::get_mut(&mut self.inner) {
58            mem::take(owned)
59        } else {
60            Vec::clone(&self.inner)
61        };
62        RcVecBuilder { inner: vec }
63    }
64}
65
66impl<T> RcVecBuilder<T> {
67    pub(crate) fn new() -> Self {
68        RcVecBuilder { inner: Vec::new() }
69    }
70
71    pub(crate) fn with_capacity(cap: usize) -> Self {
72        RcVecBuilder {
73            inner: Vec::with_capacity(cap),
74        }
75    }
76
77    pub(crate) fn push(&mut self, element: T) {
78        self.inner.push(element);
79    }
80
81    pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) {
82        self.inner.extend(iter);
83    }
84
85    pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
86        RcVecMut {
87            inner: &mut self.inner,
88        }
89    }
90
91    pub(crate) fn build(self) -> RcVec<T> {
92        RcVec {
93            inner: Rc::new(self.inner),
94        }
95    }
96}
97
98impl<'a, T> RcVecMut<'a, T> {
99    pub(crate) fn push(&mut self, element: T) {
100        self.inner.push(element);
101    }
102
103    pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) {
104        self.inner.extend(iter);
105    }
106
107    pub(crate) fn as_mut(&mut self) -> RcVecMut<T> {
108        RcVecMut { inner: self.inner }
109    }
110
111    pub(crate) fn take(self) -> RcVecBuilder<T> {
112        let vec = mem::take(self.inner);
113        RcVecBuilder { inner: vec }
114    }
115}
116
117impl<T> Clone for RcVec<T> {
118    fn clone(&self) -> Self {
119        RcVec {
120            inner: Rc::clone(&self.inner),
121        }
122    }
123}
124
125impl<T> IntoIterator for RcVecBuilder<T> {
126    type Item = T;
127    type IntoIter = RcVecIntoIter<T>;
128
129    fn into_iter(self) -> Self::IntoIter {
130        RcVecIntoIter {
131            inner: self.inner.into_iter(),
132        }
133    }
134}
135
136impl<T> Iterator for RcVecIntoIter<T> {
137    type Item = T;
138
139    fn next(&mut self) -> Option<Self::Item> {
140        self.inner.next()
141    }
142
143    fn size_hint(&self) -> (usize, Option<usize>) {
144        self.inner.size_hint()
145    }
146}
147
148impl<T> RefUnwindSafe for RcVec<T> where T: RefUnwindSafe {}