rc_vec/
rc_vec.rs

1#[cfg(doc)]
2use alloc::vec::Vec;
3
4use alloc::{rc::Rc, sync::Arc};
5use core::{
6    cmp::max,
7    iter,
8    mem::MaybeUninit,
9    ops::{Deref, DerefMut, RangeBounds},
10    ptr, slice,
11};
12use rc_vec_proc_macro::rc_impl_gen_arc_impl;
13use unique_rc::{UniqArc, UniqRc};
14
15use crate::{
16    raw::{ArcRawVec, RcRawVec},
17    utils,
18};
19
20#[rc_impl_gen_arc_impl]
21pub struct RcVec<T> {
22    raw: RcRawVec<T>,
23    len: usize,
24}
25
26#[rc_impl_gen_arc_impl]
27impl<T> Deref for RcVec<T> {
28    type Target = [T];
29
30    fn deref(&self) -> &Self::Target {
31        let ptr = self.raw.as_ptr();
32        unsafe { slice::from_raw_parts(ptr, self.len) }
33    }
34}
35
36#[rc_impl_gen_arc_impl]
37impl<T> DerefMut for RcVec<T> {
38    fn deref_mut(&mut self) -> &mut Self::Target {
39        let ptr = self.raw.as_mut_ptr();
40        unsafe { slice::from_raw_parts_mut(ptr, self.len) }
41    }
42}
43
44#[rc_impl_gen_arc_impl]
45impl<T> Drop for RcVec<T> {
46    fn drop(&mut self) {
47        self.raw.drop_elems(self.len);
48    }
49}
50
51#[rc_impl_gen_arc_impl]
52impl<T> From<UniqRc<[T]>> for RcVec<T> {
53    fn from(value: UniqRc<[T]>) -> Self {
54        let len = value.len();
55        let raw = RcRawVec::from_uniq_slice(value);
56        Self { raw, len }
57    }
58}
59
60#[rc_impl_gen_arc_impl]
61impl<T> Default for RcVec<T> {
62    fn default() -> Self {
63        Self::new()
64    }
65}
66
67#[rc_impl_gen_arc_impl]
68impl<T> RcVec<T> {
69    /// Create a new [`RcVec`]
70    ///
71    /// # Examples
72    ///
73    /// ```
74    /// # use rc_vec::RcVec;
75    /// let mut vec = RcVec::new();
76    /// vec.push(3);
77    /// assert_eq!(vec, [3]);
78    /// ```
79    pub fn new() -> Self {
80        Self { raw: RcRawVec::new(), len: 0 }
81    }
82
83    pub fn with_capacity(capacity: usize) -> Self {
84        Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
85    }
86
87    #[inline]
88    pub fn as_ptr(&self) -> *const T {
89        self.raw.as_ptr()
90    }
91
92    #[inline]
93    pub fn as_mut_ptr(&mut self) -> *mut T {
94        self.raw.as_mut_ptr()
95    }
96
97    #[inline]
98    pub fn len(&self) -> usize {
99        self.len
100    }
101
102    #[inline]
103    pub fn is_empty(&self) -> bool {
104        self.len() == 0
105    }
106
107    #[inline]
108    pub fn capacity(&self) -> usize {
109        self.raw.capacity()
110    }
111
112    #[inline]
113    pub fn push(&mut self, value: T) {
114        if self.len == self.capacity() {
115            self.raw.reserve_for_push(self.len);
116        }
117
118        unsafe {
119            let end = self.as_mut_ptr().add(self.len);
120            end.write(value);
121            self.len += 1;
122        }
123    }
124
125    pub fn reserve(&mut self, additional: usize) {
126        self.raw.reserve(self.len, additional);
127    }
128
129    pub fn reserve_exact(&mut self, additional: usize) {
130        self.raw.reserve_exact(self.len, additional);
131    }
132
133    #[inline]
134    pub fn pop(&mut self) -> Option<T> {
135        if self.len == 0 {
136            None
137        } else {
138            unsafe {
139                self.len -= 1;
140                Some(self.as_ptr().add(self.len).read())
141            }
142        }
143    }
144
145    #[inline]
146    #[track_caller]
147    pub fn remove(&mut self, index: usize) -> T {
148        fn assert_failed(index: usize, len: usize) -> ! {
149            panic!("remove index (is {index}) should be < len (is {len})")
150        }
151
152        let len = self.len();
153        if index >= len {
154            assert_failed(index, len);
155        }
156
157        unsafe {
158            let ret;
159            {
160                let ptr = self.as_mut_ptr().add(index);
161                ret = ptr.read();
162                ptr::copy(ptr.add(1), ptr, len - index - 1);
163            }
164            self.set_len(len - 1);
165            ret
166        }
167    }
168
169    #[inline]
170    #[track_caller]
171    pub fn swap_remove(&mut self, index: usize) -> T {
172        fn assert_failed(index: usize, len: usize) -> ! {
173            panic!("swap_remove index (is {index}) should be < len (is {len})")
174        }
175
176        let len = self.len();
177        if index >= len {
178            assert_failed(index, len);
179        }
180
181        unsafe {
182            let value = self.as_ptr().add(index).read();
183            let ptr = self.as_mut_ptr();
184            ptr.add(index).copy_from(ptr.add(len-1), 1);
185            self.set_len(len-1);
186            value
187        }
188    }
189
190    pub fn shrink_to_fit(&mut self) {
191        if self.capacity() > self.len() {
192            self.raw.shrink_to_fit(self.len());
193        }
194    }
195
196    pub fn shrink_to(&mut self, min_capacity: usize) {
197        if self.capacity() > min_capacity {
198            self.raw.shrink_to_fit(max(self.len(), min_capacity));
199        }
200    }
201
202    /// Like [`Vec::set_len`]
203    ///
204    /// # Safety
205    /// See [`Vec::set_len`] for safety concerns and examples.
206    #[inline]
207    pub unsafe fn set_len(&mut self, new_len: usize) {
208        self.len = new_len;
209    }
210
211    /// Like [`Vec::spare_capacity_mut`]
212    ///
213    /// # Examples
214    ///
215    /// ```
216    /// # use rc_vec::RcVec;
217    /// # use std::mem::MaybeUninit;
218    /// let mut vec = RcVec::with_capacity(4);
219    ///
220    /// vec.push(0);
221    /// assert_eq!(*vec, [0]);
222    ///
223    /// let spare = vec.spare_capacity_mut();
224    /// assert_eq!(spare.len(), 3);
225    /// spare[0] = MaybeUninit::new(1);
226    /// assert_eq!(*vec, [0]);
227    ///
228    /// unsafe {
229    ///     // SAFETY: The initialized data has been written to spare
230    ///     vec.set_len(vec.len() + 1);
231    /// }
232    /// assert_eq!(*vec, [0, 1]);
233    /// ```
234    #[inline]
235    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
236        &mut self.raw.slice_mut()[self.len..]
237    }
238
239    unsafe fn split_at_spare_mut_with_len(
240        &mut self,
241    ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
242        let (initialized, spare)
243            = self.raw.slice_mut().split_at_mut(self.len);
244        let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
245        let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
246
247        (initialized, spare, &mut self.len)
248    }
249
250    /// # Safety
251    /// `slice` `0..len` must be initialized
252    #[inline]
253    pub unsafe fn from_raw_uniq_slice(
254        slice: UniqRc<[MaybeUninit<T>]>,
255        len: usize,
256    ) -> Self {
257        Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
258    }
259
260    pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
261        slice.into()
262    }
263
264    #[inline]
265    pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
266        self.raw.take().into_rc()
267    }
268
269    #[inline]
270    pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
271        self.raw.take().into_raw_rc()
272    }
273
274    #[inline]
275    pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
276        self.shrink_to_fit();
277        let len = self.len();
278        debug_assert_eq!(len, self.capacity());
279
280        let raw = UniqRc::into_raw(self.raw.take().into_rc());
281        let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
282        unsafe { UniqRc::from_raw_unchecked(slice) }
283    }
284
285    #[inline]
286    pub fn into_rc_slice(self) -> Rc<[T]> {
287        self.into_uniq_slice().into()
288    }
289
290    #[inline]
291    pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
292        self.raw.take()
293    }
294
295    pub fn truncate(&mut self, len: usize) {
296        let old_len = self.len();
297
298        // NOTE: use `>`, reference from Vec::truncate
299        if len > old_len {
300            return;
301        }
302
303        unsafe {
304            self.set_len(len);
305            self.raw.drop_elems_from_range(len..old_len);
306        }
307    }
308
309    #[inline]
310    pub fn clear(&mut self) {
311        let old_len = self.len();
312        unsafe {
313            self.set_len(0);
314            self.raw.drop_elems(old_len);
315        }
316    }
317
318    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
319    where F: FnMut() -> T,
320    {
321        let len = self.len();
322
323        if new_len > len {
324            self.extend(iter::repeat_with(f).take(new_len-len));
325        } else {
326            self.truncate(len);
327        }
328    }
329
330    pub fn leak(mut self) -> &'static mut [T] {
331        let len = self.len();
332
333        if len == 0 {
334            return Default::default();
335        }
336
337        self.raw.take()
338            .into_raw_rc()
339            .map(UniqRc::into_raw)
340            .map(|raw| {
341                unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
342            })
343            .unwrap_or_default()
344    }
345
346    pub fn iter(&self) -> slice::Iter<'_, T> {
347        self.into_iter()
348    }
349
350    pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
351        self.into_iter()
352    }
353}
354
355#[rc_impl_gen_arc_impl]
356impl<T: Clone> RcVec<T> {
357    pub fn resize(&mut self, new_len: usize, value: T) {
358        let len = self.len();
359
360        if new_len > len {
361            self.extend(iter::repeat_n(value, new_len-len));
362        } else {
363            self.truncate(len);
364        }
365    }
366
367    pub fn extend_from_slice(&mut self, buf: &[T]) {
368        self.reserve(buf.len());
369
370        for ele in buf {
371            let len = self.len();
372            let ele = ele.clone();
373
374            unsafe {
375                self.as_mut_ptr().add(len).write(ele);
376                self.set_len(len + 1);
377            }
378        }
379    }
380
381    pub fn extend_from_within<R>(&mut self, src: R)
382    where R: RangeBounds<usize>,
383    {
384        let range = utils::range(src, ..self.len());
385        self.reserve(range.len());
386
387        let (this, spare, len) = unsafe {
388            self.split_at_spare_mut_with_len()
389        };
390
391        let to_clone = unsafe { this.get_unchecked(range) };
392
393        to_clone.iter().zip(spare)
394            .map(|(src, dst)| dst.write(src.clone()))
395            .for_each(|_| *len += 1);
396    }
397}
398
399#[rc_impl_gen_arc_impl]
400impl<T> RcVec<T> {
401    /// Macro support
402    #[doc(hidden)]
403    #[allow(unused)]
404    pub fn from_elem(elem: T, len: usize) -> Self
405    where T: Clone,
406    {
407        Self::from_iter(iter::repeat_n(elem, len))
408    }
409
410    /// Macro support
411    #[doc(hidden)]
412    #[allow(unused)]
413    pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
414        arr.into()
415    }
416}