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 #[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 #[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 } 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 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 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 #[inline]
384 pub unsafe fn set_len(&mut self, new_len: usize) {
385 self.len = new_len;
386 }
387
388 #[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 #[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 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 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 #[inline]
574 pub fn append(&mut self, other: &mut Self) {
575 let count = other.len();
576 let len = self.len();
577
578 unsafe {
579 self.reserve(count);
580
581 let dst = self.as_mut_ptr().add(len);
582 ptr::copy_nonoverlapping(other.as_ptr(), dst, count);
583
584 self.set_len(len+count);
585 other.set_len(0);
586 }
587 }
588
589 pub fn split_off(&mut self, at: usize) -> Self {
604 #[cold]
605 #[inline(never)]
606 fn assert_failed(at: usize, len: usize) -> ! {
607 panic!("`at` split index (is {at}) should be <= len (is {len})");
608 }
609
610 if at > self.len() {
611 assert_failed(at, self.len());
612 }
613
614 let remainder_len = self.len() - at;
615 let mut other = Self::with_capacity(remainder_len);
616
617 unsafe {
618 self.set_len(at);
619 other.set_len(remainder_len);
620
621 self.as_ptr().add(at)
622 .copy_to(other.as_mut_ptr(), other.len());
623 }
624
625 other
626 }
627
628 #[inline]
629 pub fn iter(&self) -> slice::Iter<'_, T> {
630 self.into_iter()
631 }
632
633 #[inline]
634 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
635 self.into_iter()
636 }
637}
638
639#[rc_impl_gen_arc_impl]
640impl<T: Clone> RcVec<T> {
641 pub fn resize(&mut self, new_len: usize, value: T) {
642 let len = self.len();
643
644 if new_len > len {
645 self.extend(iter::repeat_n(value, new_len-len));
646 } else {
647 self.truncate(len);
648 }
649 }
650
651 pub fn extend_from_slice(&mut self, buf: &[T]) {
652 self.reserve(buf.len());
653
654 for ele in buf {
655 let len = self.len();
656 let ele = ele.clone();
657
658 unsafe {
659 self.as_mut_ptr().add(len).write(ele);
660 self.set_len(len + 1);
661 }
662 }
663 }
664
665 pub fn extend_from_within<R>(&mut self, src: R)
666 where R: RangeBounds<usize>,
667 {
668 let range = utils::range(src, ..self.len());
669 self.reserve(range.len());
670
671 let (this, spare, len) = unsafe {
672 self.split_at_spare_mut_with_len()
673 };
674
675 let to_clone = unsafe { this.get_unchecked(range) };
676
677 to_clone.iter().zip(spare)
678 .map(|(src, dst)| dst.write(src.clone()))
679 .for_each(|_| *len += 1);
680 }
681}
682
683#[rc_impl_gen_arc_impl]
684impl<T> RcVec<T> {
685 #[doc(hidden)]
687 #[allow(unused)]
688 pub fn from_elem(elem: T, len: usize) -> Self
689 where T: Clone,
690 {
691 Self::from_iter(iter::repeat_n(elem, len))
692 }
693
694 #[doc(hidden)]
696 #[allow(unused)]
697 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
698 arr.into()
699 }
700}