3 use std
::panic
::RefUnwindSafe
;
7 pub(crate) struct RcVec
<T
> {
11 pub(crate) struct RcVecBuilder
<T
> {
15 pub(crate) struct RcVecMut
<'a
, T
> {
16 inner
: &'a
mut Vec
<T
>,
20 pub(crate) struct RcVecIntoIter
<T
> {
21 inner
: vec
::IntoIter
<T
>,
25 pub fn is_empty(&self) -> bool
{
29 pub fn len(&self) -> usize {
33 pub fn iter(&self) -> slice
::Iter
<T
> {
37 pub fn make_mut(&mut self) -> RcVecMut
<T
>
42 inner
: Rc
::make_mut(&mut self.inner
),
46 pub fn get_mut(&mut self) -> Option
<RcVecMut
<T
>> {
47 let inner
= Rc
::get_mut(&mut self.inner
)?
;
48 Some(RcVecMut { inner }
)
51 pub fn make_owned(mut self) -> RcVecBuilder
<T
>
55 let vec
= if let Some(owned
) = Rc
::get_mut(&mut self.inner
) {
56 mem
::replace(owned
, Vec
::new())
58 Vec
::clone(&self.inner
)
60 RcVecBuilder { inner: vec }
64 impl<T
> RcVecBuilder
<T
> {
65 pub fn new() -> Self {
66 RcVecBuilder { inner: Vec::new() }
69 pub fn with_capacity(cap
: usize) -> Self {
71 inner
: Vec
::with_capacity(cap
),
75 pub fn push(&mut self, element
: T
) {
76 self.inner
.push(element
);
79 pub fn extend(&mut self, iter
: impl IntoIterator
<Item
= T
>) {
80 self.inner
.extend(iter
);
83 pub fn as_mut(&mut self) -> RcVecMut
<T
> {
85 inner
: &mut self.inner
,
89 pub fn build(self) -> RcVec
<T
> {
91 inner
: Rc
::new(self.inner
),
96 impl<'a
, T
> RcVecMut
<'a
, T
> {
97 pub fn push(&mut self, element
: T
) {
98 self.inner
.push(element
);
101 pub fn extend(&mut self, iter
: impl IntoIterator
<Item
= T
>) {
102 self.inner
.extend(iter
);
105 pub fn pop(&mut self) -> Option
<T
> {
109 pub fn as_mut(&mut self) -> RcVecMut
<T
> {
110 RcVecMut { inner: self.inner }
114 impl<T
> Clone
for RcVec
<T
> {
115 fn clone(&self) -> Self {
117 inner
: Rc
::clone(&self.inner
),
122 impl<T
> IntoIterator
for RcVecBuilder
<T
> {
124 type IntoIter
= RcVecIntoIter
<T
>;
126 fn into_iter(self) -> Self::IntoIter
{
128 inner
: self.inner
.into_iter(),
133 impl<T
> Iterator
for RcVecIntoIter
<T
> {
136 fn next(&mut self) -> Option
<Self::Item
> {
140 fn size_hint(&self) -> (usize, Option
<usize>) {
141 self.inner
.size_hint()
145 impl<T
> RefUnwindSafe
for RcVec
<T
> where T
: RefUnwindSafe {}