Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/rust/proc-macro2/rcvec.rs
38271 views
1
// SPDX-License-Identifier: Apache-2.0 OR MIT
2
3
use alloc::rc::Rc;
4
use alloc::vec;
5
use core::mem;
6
use core::panic::RefUnwindSafe;
7
use core::slice;
8
9
pub(crate) struct RcVec<T> {
10
inner: Rc<Vec<T>>,
11
}
12
13
pub(crate) struct RcVecBuilder<T> {
14
inner: Vec<T>,
15
}
16
17
pub(crate) struct RcVecMut<'a, T> {
18
inner: &'a mut Vec<T>,
19
}
20
21
#[derive(Clone)]
22
pub(crate) struct RcVecIntoIter<T> {
23
inner: vec::IntoIter<T>,
24
}
25
26
impl<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
66
impl<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
98
impl<'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
117
impl<T> Clone for RcVec<T> {
118
fn clone(&self) -> Self {
119
RcVec {
120
inner: Rc::clone(&self.inner),
121
}
122
}
123
}
124
125
impl<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
136
impl<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
148
impl<T> RefUnwindSafe for RcVec<T> where T: RefUnwindSafe {}
149
150