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#[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 pub fn new() -> Self {
98 Self { raw: RcRawVec::new(), len: 0 }
99 }
100
101 pub fn with_capacity(capacity: usize) -> Self {
113 Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
114 }
115
116 #[inline]
118 pub fn as_ptr(&self) -> *const T {
119 self.raw.as_ptr()
120 }
121
122 #[inline]
134 pub fn as_mut_ptr(&mut self) -> *mut T {
135 self.raw.as_mut_ptr()
136 }
137
138 #[inline]
151 pub fn as_slice(&self) -> &[T] {
152 self
153 }
154
155 #[inline]
170 pub fn as_mut_slice(&mut self) -> &mut [T] {
171 self
172 }
173
174 #[inline]
189 pub fn len(&self) -> usize {
190 self.len
191 }
192
193 #[inline]
195 pub fn is_empty(&self) -> bool {
196 self.len() == 0
197 }
198
199 #[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 #[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 } 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 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 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 #[inline]
374 pub unsafe fn set_len(&mut self, new_len: usize) {
375 self.len = new_len;
376 }
377
378 #[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 #[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 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 #[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 #[doc(hidden)]
579 #[allow(unused)]
580 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
581 arr.into()
582 }
583}