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> { is_empty(&self) -> bool27 pub(crate) fn is_empty(&self) -> bool { 28 self.inner.is_empty() 29 } 30 len(&self) -> usize31 pub(crate) fn len(&self) -> usize { 32 self.inner.len() 33 } 34 iter(&self) -> slice::Iter<T>35 pub(crate) fn iter(&self) -> slice::Iter<T> { 36 self.inner.iter() 37 } 38 make_mut(&mut self) -> RcVecMut<T> where T: Clone,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 get_mut(&mut self) -> Option<RcVecMut<T>>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 make_owned(mut self) -> RcVecBuilder<T> where T: Clone,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> { new() -> Self67 pub(crate) fn new() -> Self { 68 RcVecBuilder { inner: Vec::new() } 69 } 70 with_capacity(cap: usize) -> Self71 pub(crate) fn with_capacity(cap: usize) -> Self { 72 RcVecBuilder { 73 inner: Vec::with_capacity(cap), 74 } 75 } 76 push(&mut self, element: T)77 pub(crate) fn push(&mut self, element: T) { 78 self.inner.push(element); 79 } 80 extend(&mut self, iter: impl IntoIterator<Item = T>)81 pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) { 82 self.inner.extend(iter); 83 } 84 as_mut(&mut self) -> RcVecMut<T>85 pub(crate) fn as_mut(&mut self) -> RcVecMut<T> { 86 RcVecMut { 87 inner: &mut self.inner, 88 } 89 } 90 build(self) -> RcVec<T>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> { push(&mut self, element: T)99 pub(crate) fn push(&mut self, element: T) { 100 self.inner.push(element); 101 } 102 extend(&mut self, iter: impl IntoIterator<Item = T>)103 pub(crate) fn extend(&mut self, iter: impl IntoIterator<Item = T>) { 104 self.inner.extend(iter); 105 } 106 as_mut(&mut self) -> RcVecMut<T>107 pub(crate) fn as_mut(&mut self) -> RcVecMut<T> { 108 RcVecMut { inner: self.inner } 109 } 110 take(self) -> RcVecBuilder<T>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> { clone(&self) -> Self118 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 into_iter(self) -> Self::IntoIter129 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 next(&mut self) -> Option<Self::Item>139 fn next(&mut self) -> Option<Self::Item> { 140 self.inner.next() 141 } 142 size_hint(&self) -> (usize, Option<usize>)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