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#[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 pub fn new() -> Self {
108 Self { raw: RcRawVec::new(), len: 0 }
109 }
110
111 pub fn with_capacity(capacity: usize) -> Self {
123 Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
124 }
125
126 #[inline]
128 pub fn as_ptr(&self) -> *const T {
129 self.raw.as_ptr()
130 }
131
132 #[inline]
144 pub fn as_mut_ptr(&mut self) -> *mut T {
145 self.raw.as_mut_ptr()
146 }
147
148 #[inline]
161 pub fn as_slice(&self) -> &[T] {
162 self
163 }
164
165 #[inline]
180 pub fn as_mut_slice(&mut self) -> &mut [T] {
181 self
182 }
183
184 #[inline]
199 pub fn len(&self) -> usize {
200 self.len
201 }
202
203 #[inline]
205 pub fn is_empty(&self) -> bool {
206 self.len() == 0
207 }
208
209 #[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 pub fn pop_if<P>(&mut self, predicate: P) -> Option<T>
260 where P: FnOnce(&mut T) -> bool
261 {
262 let last = self.last_mut()?;
263
264 if predicate(last) {
265 self.pop()
266 } else {
267 None
268 }
269 }
270
271 #[inline]
272 #[track_caller]
273 pub fn remove(&mut self, index: usize) -> T {
274 fn assert_failed(index: usize, len: usize) -> ! {
275 panic!("remove index (is {index}) should be < len (is {len})")
276 }
277
278 let len = self.len();
279 if index >= len {
280 assert_failed(index, len);
281 }
282
283 unsafe {
284 let ret;
285 {
286 let ptr = self.as_mut_ptr().add(index);
287 ret = ptr.read();
288 ptr::copy(ptr.add(1), ptr, len - index - 1);
289 }
290 self.set_len(len - 1);
291 ret
292 }
293 }
294
295 #[track_caller]
312 pub fn insert(&mut self, index: usize, element: T) {
313 #[cold]
314 #[inline(never)]
315 #[track_caller]
316 fn assert_failed(index: usize, len: usize) -> ! {
317 panic!("insertion index (is {index}) should be <= len (is {len})");
318 }
319
320 let len = self.len();
321
322 if len == self.capacity() {
323 self.reserve(1);
324 }
325
326 unsafe {
327 let p = self.as_mut_ptr().add(index);
328
329 if index < len {
330 ptr::copy(p, p.add(1), len - index);
331 } else if index == len {
332 } else {
334 assert_failed(index, len);
335 }
336
337 ptr::write(p, element);
338
339 self.set_len(len + 1);
340 }
341 }
342
343 #[inline]
344 #[track_caller]
345 pub fn swap_remove(&mut self, index: usize) -> T {
346 fn assert_failed(index: usize, len: usize) -> ! {
347 panic!("swap_remove index (is {index}) should be < len (is {len})")
348 }
349
350 let len = self.len();
351 if index >= len {
352 assert_failed(index, len);
353 }
354
355 unsafe {
356 let value = self.as_ptr().add(index).read();
357 let ptr = self.as_mut_ptr();
358 ptr.add(index).copy_from(ptr.add(len-1), 1);
359 self.set_len(len-1);
360 value
361 }
362 }
363
364 pub fn shrink_to_fit(&mut self) {
380 if self.capacity() > self.len() {
381 self.raw.shrink_to_fit(self.len());
382 }
383 }
384
385 pub fn shrink_to(&mut self, min_capacity: usize) {
387 if self.capacity() > min_capacity {
388 self.raw.shrink_to_fit(max(self.len(), min_capacity));
389 }
390 }
391
392 #[inline]
397 pub unsafe fn set_len(&mut self, new_len: usize) {
398 self.len = new_len;
399 }
400
401 #[inline]
425 pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
426 &mut self.raw.slice_mut()[self.len..]
427 }
428
429 unsafe fn split_at_spare_mut_with_len(
430 &mut self,
431 ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
432 let (initialized, spare)
433 = self.raw.slice_mut().split_at_mut(self.len);
434 let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
435 let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
436
437 (initialized, spare, &mut self.len)
438 }
439
440 #[inline]
443 pub unsafe fn from_raw_uniq_slice(
444 slice: UniqRc<[MaybeUninit<T>]>,
445 len: usize,
446 ) -> Self {
447 Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
448 }
449
450 pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
451 slice.into()
452 }
453
454 #[inline]
455 pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
456 self.raw.take().into_rc()
457 }
458
459 #[inline]
460 pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
461 self.raw.take().into_raw_rc()
462 }
463
464 #[inline]
465 pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
466 self.shrink_to_fit();
467 let len = self.len();
468 debug_assert_eq!(len, self.capacity());
469
470 let raw = UniqRc::into_raw(self.raw.take().into_rc());
471 let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
472 unsafe { UniqRc::from_raw_unchecked(slice) }
473 }
474
475 #[inline]
476 pub fn into_rc_slice(self) -> Rc<[T]> {
477 self.into_uniq_slice().into()
478 }
479
480 #[inline]
481 pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
482 self.raw.take()
483 }
484
485 pub fn truncate(&mut self, len: usize) {
486 let old_len = self.len();
487
488 if len > old_len {
490 return;
491 }
492
493 unsafe {
494 self.set_len(len);
495 self.raw.drop_elems_from_range(len..old_len);
496 }
497 }
498
499 #[inline]
500 pub fn clear(&mut self) {
501 let old_len = self.len();
502 unsafe {
503 self.set_len(0);
504 self.raw.drop_elems(old_len);
505 }
506 }
507
508 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
509 where F: FnMut() -> T,
510 {
511 let len = self.len();
512
513 if new_len > len {
514 self.extend(iter::repeat_with(f).take(new_len-len));
515 } else {
516 self.truncate(len);
517 }
518 }
519
520 pub fn leak(mut self) -> &'static mut [T] {
521 let len = self.len();
522
523 if len == 0 {
524 return Default::default();
525 }
526
527 self.raw.take()
528 .into_raw_rc()
529 .map(UniqRc::into_raw)
530 .map(|raw| {
531 unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
532 })
533 .unwrap_or_default()
534 }
535
536 pub fn drain<R>(&mut self, range: R) -> RcVecDrain<'_, T>
552 where R: RangeBounds<usize>,
553 {
554 let len = self.len();
555 let Range { start, end } = utils::range(range, ..len);
556
557 unsafe {
558 self.set_len(start);
559
560 let slice = slice::from_raw_parts(
561 self.as_ptr().add(start),
562 end - start,
563 );
564
565 RcVecDrain {
566 tail_start: end,
567 tail_len: len - end,
568 iter: slice.iter(),
569 vec: self.into(),
570 }
571 }
572 }
573
574 #[inline]
587 pub fn append(&mut self, other: &mut Self) {
588 let count = other.len();
589 let len = self.len();
590
591 unsafe {
592 self.reserve(count);
593
594 let dst = self.as_mut_ptr().add(len);
595 ptr::copy_nonoverlapping(other.as_ptr(), dst, count);
596
597 self.set_len(len+count);
598 other.set_len(0);
599 }
600 }
601
602 pub fn split_off(&mut self, at: usize) -> Self {
617 #[cold]
618 #[inline(never)]
619 fn assert_failed(at: usize, len: usize) -> ! {
620 panic!("`at` split index (is {at}) should be <= len (is {len})");
621 }
622
623 if at > self.len() {
624 assert_failed(at, self.len());
625 }
626
627 let remainder_len = self.len() - at;
628 let mut other = Self::with_capacity(remainder_len);
629
630 unsafe {
631 self.set_len(at);
632 other.set_len(remainder_len);
633
634 self.as_ptr().add(at)
635 .copy_to(other.as_mut_ptr(), other.len());
636 }
637
638 other
639 }
640
641 #[inline]
642 pub fn iter(&self) -> slice::Iter<'_, T> {
643 self.into_iter()
644 }
645
646 #[inline]
647 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
648 self.into_iter()
649 }
650
651 pub fn retain<F>(&mut self, mut f: F)
671 where F: FnMut(&T) -> bool,
672 {
673 self.retain_mut(|elem| f(elem));
674 }
675
676 pub fn retain_mut<F>(&mut self, mut f: F)
678 where F: FnMut(&mut T) -> bool,
679 {
680 let original_len = self.len();
683 unsafe { self.set_len(0) };
684
685 struct ShiftGuard<'a, T> {
686 v: &'a mut RcVec<T>,
687 processed_len: usize,
688 deleted_cnt: usize,
689 original_len: usize,
690 }
691
692 impl<T> Drop for ShiftGuard<'_, T> {
693 fn drop(&mut self) {
694 if self.deleted_cnt > 0 {
695 unsafe {
697 ptr::copy(
698 self.v.as_ptr().add(self.processed_len),
699 self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt),
700 self.original_len - self.processed_len,
701 );
702 }
703 }
704 unsafe {
706 self.v.set_len(self.original_len - self.deleted_cnt);
707 }
708 }
709 }
710
711 let mut g = ShiftGuard {
712 v: self,
713 processed_len: 0,
714 deleted_cnt: 0,
715 original_len,
716 };
717
718 fn process_loop<F, T, const DELETED: bool>(
719 original_len: usize,
720 f: &mut F,
721 g: &mut ShiftGuard<'_, T>,
722 )
723 where F: FnMut(&mut T) -> bool,
724 {
725 while g.processed_len != original_len {
726 let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) };
728 if !f(cur) {
729 g.processed_len += 1;
731 g.deleted_cnt += 1;
732 unsafe { ptr::drop_in_place(cur) };
734 if DELETED {
736 continue;
737 } else {
738 break;
739 }
740 }
741 if DELETED {
742 unsafe {
745 let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt);
746 ptr::copy_nonoverlapping(cur, hole_slot, 1);
747 }
748 }
749 g.processed_len += 1;
750 }
751 }
752
753 process_loop::<F, T, false>(original_len, &mut f, &mut g);
754 process_loop::<F, T, true>(original_len, &mut f, &mut g);
755 drop(g);
756 }
757}
758
759#[rc_impl_gen_arc_impl]
760impl<T: Clone> RcVec<T> {
761 pub fn resize(&mut self, new_len: usize, value: T) {
762 let len = self.len();
763
764 if new_len > len {
765 self.extend(iter::repeat_n(value, new_len-len));
766 } else {
767 self.truncate(len);
768 }
769 }
770
771 pub fn extend_from_slice(&mut self, buf: &[T]) {
772 self.reserve(buf.len());
773
774 for ele in buf {
775 let len = self.len();
776 let ele = ele.clone();
777
778 unsafe {
779 self.as_mut_ptr().add(len).write(ele);
780 self.set_len(len + 1);
781 }
782 }
783 }
784
785 pub fn extend_from_within<R>(&mut self, src: R)
786 where R: RangeBounds<usize>,
787 {
788 let range = utils::range(src, ..self.len());
789 self.reserve(range.len());
790
791 let (this, spare, len) = unsafe {
792 self.split_at_spare_mut_with_len()
793 };
794
795 let to_clone = unsafe { this.get_unchecked(range) };
796
797 to_clone.iter().zip(spare)
798 .map(|(src, dst)| dst.write(src.clone()))
799 .for_each(|_| *len += 1);
800 }
801}
802
803#[rc_impl_gen_arc_impl]
804impl<T> RcVec<T> {
805 #[doc(hidden)]
807 #[allow(unused)]
808 pub fn from_elem(elem: T, len: usize) -> Self
809 where T: Clone,
810 {
811 Self::from_iter(iter::repeat_n(elem, len))
812 }
813
814 #[doc(hidden)]
816 #[allow(unused)]
817 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
818 arr.into()
819 }
820}