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