rc_vec/
rc_vec.rs

1#[cfg(doc)]
2use alloc::{boxed::Box, 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
20mod trait_impls;
21
22/// [`RcVec`] based on [`Rc`] and can be converted from Rc without allocation,
23/// just like [`Box`] is converted to [`Vec`]
24///
25/// # Examples
26///
27/// ```
28/// # use std::rc::Rc;
29/// use rc_vec::RcVec;
30///
31/// let rc: Rc<[i32]> = Rc::new([1, 2, 3]);
32/// let mut rc_vec = RcVec::from(rc);
33///
34/// assert_eq!(rc_vec, [1, 2, 3]);
35/// rc_vec.push(4);
36/// assert_eq!(rc_vec, [1, 2, 3, 4]);
37/// ```
38#[rc_impl_gen_arc_impl]
39pub struct RcVec<T> {
40    raw: RcRawVec<T>,
41    len: usize,
42}
43
44#[rc_impl_gen_arc_impl]
45impl<T> Deref for RcVec<T> {
46    type Target = [T];
47
48    fn deref(&self) -> &Self::Target {
49        let ptr = self.raw.as_ptr();
50        unsafe { slice::from_raw_parts(ptr, self.len) }
51    }
52}
53
54#[rc_impl_gen_arc_impl]
55impl<T> DerefMut for RcVec<T> {
56    fn deref_mut(&mut self) -> &mut Self::Target {
57        let ptr = self.raw.as_mut_ptr();
58        unsafe { slice::from_raw_parts_mut(ptr, self.len) }
59    }
60}
61
62#[rc_impl_gen_arc_impl]
63impl<T> Drop for RcVec<T> {
64    fn drop(&mut self) {
65        self.raw.drop_elems(self.len);
66    }
67}
68
69#[rc_impl_gen_arc_impl]
70impl<T> From<UniqRc<[T]>> for RcVec<T> {
71    fn from(value: UniqRc<[T]>) -> Self {
72        let len = value.len();
73        let raw = RcRawVec::from_uniq_slice(value);
74        Self { raw, len }
75    }
76}
77
78#[rc_impl_gen_arc_impl]
79impl<T> Default for RcVec<T> {
80    fn default() -> Self {
81        Self::new()
82    }
83}
84
85#[rc_impl_gen_arc_impl]
86impl<T> RcVec<T> {
87    /// Create a new [`RcVec`]
88    ///
89    /// # Examples
90    ///
91    /// ```
92    /// # use rc_vec::RcVec;
93    /// let mut vec = RcVec::new();
94    /// vec.push(3);
95    /// assert_eq!(vec, [3]);
96    /// ```
97    pub fn new() -> Self {
98        Self { raw: RcRawVec::new(), len: 0 }
99    }
100
101    /// Create a new [`RcVec`] Initial capacity of `capacity`
102    ///
103    /// # Examples
104    ///
105    /// ```
106    /// # use rc_vec::RcVec;
107    /// let vec = RcVec::with_capacity(176);
108    /// assert_eq!(vec.capacity(), 176);
109    /// assert_eq!(vec.len(), 0);
110    /// # assert_ne!(vec, [1]);
111    /// ```
112    pub fn with_capacity(capacity: usize) -> Self {
113        Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
114    }
115
116    /// Readonly permission pointer
117    #[inline]
118    pub fn as_ptr(&self) -> *const T {
119        self.raw.as_ptr()
120    }
121
122    /// Read and Write permission pointer
123    ///
124    /// # Examples
125    ///
126    /// ```
127    /// # use rc_vec::rc_vec;
128    /// let mut vec = rc_vec![1, 2, 3];
129    /// assert_eq!(vec, [1, 2, 3]);
130    /// unsafe { *vec.as_mut_ptr() += 1 }
131    /// assert_eq!(vec, [2, 2, 3]);
132    /// ```
133    #[inline]
134    pub fn as_mut_ptr(&mut self) -> *mut T {
135        self.raw.as_mut_ptr()
136    }
137
138    /// Extracts a slice containing the entire vector.
139    ///
140    /// Equivalent to `&s[..].`
141    ///
142    /// # Examples
143    ///
144    /// ```
145    /// # use rc_vec::rc_vec;
146    /// let vec = rc_vec![1, 2, 3];
147    /// let slice: &[i32] = vec.as_slice();
148    /// assert_eq!(slice, [1, 2, 3]);
149    /// ```
150    #[inline]
151    pub fn as_slice(&self) -> &[T] {
152        self
153    }
154
155    /// Extracts a mutable slice of the entire vector.
156    ///
157    /// Equivalent to `&mut s[..].`
158    ///
159    /// # Examples
160    ///
161    /// ```
162    /// # use rc_vec::rc_vec;
163    /// let mut vec = rc_vec![1, 2, 3];
164    /// let slice: &mut [i32] = vec.as_mut_slice();
165    /// assert_eq!(slice, [1, 2, 3]);
166    /// slice[1] += 2;
167    /// assert_eq!(slice, [1, 4, 3]);
168    /// ```
169    #[inline]
170    pub fn as_mut_slice(&mut self) -> &mut [T] {
171        self
172    }
173
174    /// Get initialized datas count
175    ///
176    /// # Examples
177    ///
178    /// ```
179    /// # use rc_vec::RcVec;
180    /// let mut vec = RcVec::with_capacity(4);
181    /// assert_eq!(vec.capacity(), 4);
182    ///
183    /// vec.push(2333);
184    ///
185    /// assert_eq!(vec.len(), 1);
186    /// assert_eq!(vec.capacity(), 4);
187    /// ```
188    #[inline]
189    pub fn len(&self) -> usize {
190        self.len
191    }
192
193    /// Like `.len() == 0`
194    #[inline]
195    pub fn is_empty(&self) -> bool {
196        self.len() == 0
197    }
198
199    /// Get allocated capacity
200    ///
201    /// # Examples
202    ///
203    /// ```
204    /// # use rc_vec::RcVec;
205    /// let vec = RcVec::with_capacity(176);
206    /// assert_eq!(vec.capacity(), 176);
207    /// assert_eq!(vec.len(), 0);
208    /// # assert_ne!(vec, [1]);
209    /// ```
210    #[inline]
211    pub fn capacity(&self) -> usize {
212        self.raw.capacity()
213    }
214
215    #[inline]
216    pub fn push(&mut self, value: T) {
217        if self.len == self.capacity() {
218            self.raw.reserve_for_push(self.len);
219        }
220
221        unsafe {
222            let end = self.as_mut_ptr().add(self.len);
223            end.write(value);
224            self.len += 1;
225        }
226    }
227
228    pub fn reserve(&mut self, additional: usize) {
229        self.raw.reserve(self.len, additional);
230    }
231
232    pub fn reserve_exact(&mut self, additional: usize) {
233        self.raw.reserve_exact(self.len, additional);
234    }
235
236    #[inline]
237    pub fn pop(&mut self) -> Option<T> {
238        if self.len == 0 {
239            None
240        } else {
241            unsafe {
242                self.len -= 1;
243                Some(self.as_ptr().add(self.len).read())
244            }
245        }
246    }
247
248    #[inline]
249    #[track_caller]
250    pub fn remove(&mut self, index: usize) -> T {
251        fn assert_failed(index: usize, len: usize) -> ! {
252            panic!("remove index (is {index}) should be < len (is {len})")
253        }
254
255        let len = self.len();
256        if index >= len {
257            assert_failed(index, len);
258        }
259
260        unsafe {
261            let ret;
262            {
263                let ptr = self.as_mut_ptr().add(index);
264                ret = ptr.read();
265                ptr::copy(ptr.add(1), ptr, len - index - 1);
266            }
267            self.set_len(len - 1);
268            ret
269        }
270    }
271
272    /// Like [`Vec::insert`]
273    ///
274    /// # Panics
275    ///
276    /// - `index > self.len()`
277    ///
278    /// # Examples
279    ///
280    /// ```
281    /// # use rc_vec::rc_vec;
282    /// let mut vec = rc_vec![1, 2, 3];
283    /// vec.insert(1, 4);
284    /// assert_eq!(vec, [1, 4, 2, 3]);
285    /// vec.insert(4, 5);
286    /// assert_eq!(vec, [1, 4, 2, 3, 5]);
287    /// ```
288    #[track_caller]
289    pub fn insert(&mut self, index: usize, element: T) {
290        #[cold]
291        #[inline(never)]
292        #[track_caller]
293        fn assert_failed(index: usize, len: usize) -> ! {
294            panic!("insertion index (is {index}) should be <= len (is {len})");
295        }
296
297        let len = self.len();
298
299        if len == self.capacity() {
300            self.reserve(1);
301        }
302
303        unsafe {
304            let p = self.as_mut_ptr().add(index);
305
306            if index < len {
307                ptr::copy(p, p.add(1), len - index);
308            } else if index == len {
309                // no move
310            } else {
311                assert_failed(index, len);
312            }
313
314            ptr::write(p, element);
315
316            self.set_len(len + 1);
317        }
318    }
319
320    #[inline]
321    #[track_caller]
322    pub fn swap_remove(&mut self, index: usize) -> T {
323        fn assert_failed(index: usize, len: usize) -> ! {
324            panic!("swap_remove index (is {index}) should be < len (is {len})")
325        }
326
327        let len = self.len();
328        if index >= len {
329            assert_failed(index, len);
330        }
331
332        unsafe {
333            let value = self.as_ptr().add(index).read();
334            let ptr = self.as_mut_ptr();
335            ptr.add(index).copy_from(ptr.add(len-1), 1);
336            self.set_len(len-1);
337            value
338        }
339    }
340
341    /// Reallocate to remove excess capacity
342    ///
343    /// # Examples
344    ///
345    /// ```
346    /// # use rc_vec::RcVec;
347    /// let mut vec = RcVec::with_capacity(16);
348    /// vec.push(233);
349    /// assert_eq!(vec.len(), 1);
350    /// assert_eq!(vec.capacity(), 16);
351    ///
352    /// vec.shrink_to_fit();
353    /// assert_eq!(vec.len(), 1);
354    /// assert_eq!(vec.capacity(), 1);
355    /// ```
356    pub fn shrink_to_fit(&mut self) {
357        if self.capacity() > self.len() {
358            self.raw.shrink_to_fit(self.len());
359        }
360    }
361
362    /// Reallocate to max(`min_capacity`, `.len()`)
363    pub fn shrink_to(&mut self, min_capacity: usize) {
364        if self.capacity() > min_capacity {
365            self.raw.shrink_to_fit(max(self.len(), min_capacity));
366        }
367    }
368
369    /// Like [`Vec::set_len`]
370    ///
371    /// # Safety
372    /// See [`Vec::set_len`] for safety concerns and examples.
373    #[inline]
374    pub unsafe fn set_len(&mut self, new_len: usize) {
375        self.len = new_len;
376    }
377
378    /// Like [`Vec::spare_capacity_mut`]
379    ///
380    /// # Examples
381    ///
382    /// ```
383    /// # use rc_vec::RcVec;
384    /// # use std::mem::MaybeUninit;
385    /// let mut vec = RcVec::with_capacity(4);
386    ///
387    /// vec.push(0);
388    /// assert_eq!(*vec, [0]);
389    ///
390    /// let spare = vec.spare_capacity_mut();
391    /// assert_eq!(spare.len(), 3);
392    /// spare[0] = MaybeUninit::new(1);
393    /// assert_eq!(*vec, [0]);
394    ///
395    /// unsafe {
396    ///     // SAFETY: The initialized data has been written to spare
397    ///     vec.set_len(vec.len() + 1);
398    /// }
399    /// assert_eq!(*vec, [0, 1]);
400    /// ```
401    #[inline]
402    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
403        &mut self.raw.slice_mut()[self.len..]
404    }
405
406    unsafe fn split_at_spare_mut_with_len(
407        &mut self,
408    ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
409        let (initialized, spare)
410            = self.raw.slice_mut().split_at_mut(self.len);
411        let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
412        let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
413
414        (initialized, spare, &mut self.len)
415    }
416
417    /// # Safety
418    /// `slice` `0..len` must be initialized
419    #[inline]
420    pub unsafe fn from_raw_uniq_slice(
421        slice: UniqRc<[MaybeUninit<T>]>,
422        len: usize,
423    ) -> Self {
424        Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
425    }
426
427    pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
428        slice.into()
429    }
430
431    #[inline]
432    pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
433        self.raw.take().into_rc()
434    }
435
436    #[inline]
437    pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
438        self.raw.take().into_raw_rc()
439    }
440
441    #[inline]
442    pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
443        self.shrink_to_fit();
444        let len = self.len();
445        debug_assert_eq!(len, self.capacity());
446
447        let raw = UniqRc::into_raw(self.raw.take().into_rc());
448        let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
449        unsafe { UniqRc::from_raw_unchecked(slice) }
450    }
451
452    #[inline]
453    pub fn into_rc_slice(self) -> Rc<[T]> {
454        self.into_uniq_slice().into()
455    }
456
457    #[inline]
458    pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
459        self.raw.take()
460    }
461
462    pub fn truncate(&mut self, len: usize) {
463        let old_len = self.len();
464
465        // NOTE: use `>`, reference from Vec::truncate
466        if len > old_len {
467            return;
468        }
469
470        unsafe {
471            self.set_len(len);
472            self.raw.drop_elems_from_range(len..old_len);
473        }
474    }
475
476    #[inline]
477    pub fn clear(&mut self) {
478        let old_len = self.len();
479        unsafe {
480            self.set_len(0);
481            self.raw.drop_elems(old_len);
482        }
483    }
484
485    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
486    where F: FnMut() -> T,
487    {
488        let len = self.len();
489
490        if new_len > len {
491            self.extend(iter::repeat_with(f).take(new_len-len));
492        } else {
493            self.truncate(len);
494        }
495    }
496
497    pub fn leak(mut self) -> &'static mut [T] {
498        let len = self.len();
499
500        if len == 0 {
501            return Default::default();
502        }
503
504        self.raw.take()
505            .into_raw_rc()
506            .map(UniqRc::into_raw)
507            .map(|raw| {
508                unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
509            })
510            .unwrap_or_default()
511    }
512
513    pub fn iter(&self) -> slice::Iter<'_, T> {
514        self.into_iter()
515    }
516
517    pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
518        self.into_iter()
519    }
520}
521
522#[rc_impl_gen_arc_impl]
523impl<T: Clone> RcVec<T> {
524    pub fn resize(&mut self, new_len: usize, value: T) {
525        let len = self.len();
526
527        if new_len > len {
528            self.extend(iter::repeat_n(value, new_len-len));
529        } else {
530            self.truncate(len);
531        }
532    }
533
534    pub fn extend_from_slice(&mut self, buf: &[T]) {
535        self.reserve(buf.len());
536
537        for ele in buf {
538            let len = self.len();
539            let ele = ele.clone();
540
541            unsafe {
542                self.as_mut_ptr().add(len).write(ele);
543                self.set_len(len + 1);
544            }
545        }
546    }
547
548    pub fn extend_from_within<R>(&mut self, src: R)
549    where R: RangeBounds<usize>,
550    {
551        let range = utils::range(src, ..self.len());
552        self.reserve(range.len());
553
554        let (this, spare, len) = unsafe {
555            self.split_at_spare_mut_with_len()
556        };
557
558        let to_clone = unsafe { this.get_unchecked(range) };
559
560        to_clone.iter().zip(spare)
561            .map(|(src, dst)| dst.write(src.clone()))
562            .for_each(|_| *len += 1);
563    }
564}
565
566#[rc_impl_gen_arc_impl]
567impl<T> RcVec<T> {
568    /// Macro support
569    #[doc(hidden)]
570    #[allow(unused)]
571    pub fn from_elem(elem: T, len: usize) -> Self
572    where T: Clone,
573    {
574        Self::from_iter(iter::repeat_n(elem, len))
575    }
576
577    /// Macro support
578    #[doc(hidden)]
579    #[allow(unused)]
580    pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
581        arr.into()
582    }
583}