Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 {}