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