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
20#[rc_impl_gen_arc_impl]
37pub struct RcVec<T> {
38 raw: RcRawVec<T>,
39 len: usize,
40}
41
42#[rc_impl_gen_arc_impl]
43impl<T> Deref for RcVec<T> {
44 type Target = [T];
45
46 fn deref(&self) -> &Self::Target {
47 let ptr = self.raw.as_ptr();
48 unsafe { slice::from_raw_parts(ptr, self.len) }
49 }
50}
51
52#[rc_impl_gen_arc_impl]
53impl<T> DerefMut for RcVec<T> {
54 fn deref_mut(&mut self) -> &mut Self::Target {
55 let ptr = self.raw.as_mut_ptr();
56 unsafe { slice::from_raw_parts_mut(ptr, self.len) }
57 }
58}
59
60#[rc_impl_gen_arc_impl]
61impl<T> Drop for RcVec<T> {
62 fn drop(&mut self) {
63 self.raw.drop_elems(self.len);
64 }
65}
66
67#[rc_impl_gen_arc_impl]
68impl<T> From<UniqRc<[T]>> for RcVec<T> {
69 fn from(value: UniqRc<[T]>) -> Self {
70 let len = value.len();
71 let raw = RcRawVec::from_uniq_slice(value);
72 Self { raw, len }
73 }
74}
75
76#[rc_impl_gen_arc_impl]
77impl<T> Default for RcVec<T> {
78 fn default() -> Self {
79 Self::new()
80 }
81}
82
83#[rc_impl_gen_arc_impl]
84impl<T> RcVec<T> {
85 pub fn new() -> Self {
96 Self { raw: RcRawVec::new(), len: 0 }
97 }
98
99 pub fn with_capacity(capacity: usize) -> Self {
111 Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
112 }
113
114 #[inline]
116 pub fn as_ptr(&self) -> *const T {
117 self.raw.as_ptr()
118 }
119
120 #[inline]
132 pub fn as_mut_ptr(&mut self) -> *mut T {
133 self.raw.as_mut_ptr()
134 }
135
136 #[inline]
151 pub fn len(&self) -> usize {
152 self.len
153 }
154
155 #[inline]
157 pub fn is_empty(&self) -> bool {
158 self.len() == 0
159 }
160
161 #[inline]
173 pub fn capacity(&self) -> usize {
174 self.raw.capacity()
175 }
176
177 #[inline]
178 pub fn push(&mut self, value: T) {
179 if self.len == self.capacity() {
180 self.raw.reserve_for_push(self.len);
181 }
182
183 unsafe {
184 let end = self.as_mut_ptr().add(self.len);
185 end.write(value);
186 self.len += 1;
187 }
188 }
189
190 pub fn reserve(&mut self, additional: usize) {
191 self.raw.reserve(self.len, additional);
192 }
193
194 pub fn reserve_exact(&mut self, additional: usize) {
195 self.raw.reserve_exact(self.len, additional);
196 }
197
198 #[inline]
199 pub fn pop(&mut self) -> Option<T> {
200 if self.len == 0 {
201 None
202 } else {
203 unsafe {
204 self.len -= 1;
205 Some(self.as_ptr().add(self.len).read())
206 }
207 }
208 }
209
210 #[inline]
211 #[track_caller]
212 pub fn remove(&mut self, index: usize) -> T {
213 fn assert_failed(index: usize, len: usize) -> ! {
214 panic!("remove index (is {index}) should be < len (is {len})")
215 }
216
217 let len = self.len();
218 if index >= len {
219 assert_failed(index, len);
220 }
221
222 unsafe {
223 let ret;
224 {
225 let ptr = self.as_mut_ptr().add(index);
226 ret = ptr.read();
227 ptr::copy(ptr.add(1), ptr, len - index - 1);
228 }
229 self.set_len(len - 1);
230 ret
231 }
232 }
233
234 #[track_caller]
251 pub fn insert(&mut self, index: usize, element: T) {
252 #[cold]
253 #[inline(never)]
254 #[track_caller]
255 fn assert_failed(index: usize, len: usize) -> ! {
256 panic!("insertion index (is {index}) should be <= len (is {len})");
257 }
258
259 let len = self.len();
260
261 if len == self.capacity() {
262 self.reserve(1);
263 }
264
265 unsafe {
266 let p = self.as_mut_ptr().add(index);
267
268 if index < len {
269 ptr::copy(p, p.add(1), len - index);
270 } else if index == len {
271 } else {
273 assert_failed(index, len);
274 }
275
276 ptr::write(p, element);
277
278 self.set_len(len + 1);
279 }
280 }
281
282 #[inline]
283 #[track_caller]
284 pub fn swap_remove(&mut self, index: usize) -> T {
285 fn assert_failed(index: usize, len: usize) -> ! {
286 panic!("swap_remove index (is {index}) should be < len (is {len})")
287 }
288
289 let len = self.len();
290 if index >= len {
291 assert_failed(index, len);
292 }
293
294 unsafe {
295 let value = self.as_ptr().add(index).read();
296 let ptr = self.as_mut_ptr();
297 ptr.add(index).copy_from(ptr.add(len-1), 1);
298 self.set_len(len-1);
299 value
300 }
301 }
302
303 pub fn shrink_to_fit(&mut self) {
319 if self.capacity() > self.len() {
320 self.raw.shrink_to_fit(self.len());
321 }
322 }
323
324 pub fn shrink_to(&mut self, min_capacity: usize) {
326 if self.capacity() > min_capacity {
327 self.raw.shrink_to_fit(max(self.len(), min_capacity));
328 }
329 }
330
331 #[inline]
336 pub unsafe fn set_len(&mut self, new_len: usize) {
337 self.len = new_len;
338 }
339
340 #[inline]
364 pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
365 &mut self.raw.slice_mut()[self.len..]
366 }
367
368 unsafe fn split_at_spare_mut_with_len(
369 &mut self,
370 ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
371 let (initialized, spare)
372 = self.raw.slice_mut().split_at_mut(self.len);
373 let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
374 let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
375
376 (initialized, spare, &mut self.len)
377 }
378
379 #[inline]
382 pub unsafe fn from_raw_uniq_slice(
383 slice: UniqRc<[MaybeUninit<T>]>,
384 len: usize,
385 ) -> Self {
386 Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
387 }
388
389 pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
390 slice.into()
391 }
392
393 #[inline]
394 pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
395 self.raw.take().into_rc()
396 }
397
398 #[inline]
399 pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
400 self.raw.take().into_raw_rc()
401 }
402
403 #[inline]
404 pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
405 self.shrink_to_fit();
406 let len = self.len();
407 debug_assert_eq!(len, self.capacity());
408
409 let raw = UniqRc::into_raw(self.raw.take().into_rc());
410 let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
411 unsafe { UniqRc::from_raw_unchecked(slice) }
412 }
413
414 #[inline]
415 pub fn into_rc_slice(self) -> Rc<[T]> {
416 self.into_uniq_slice().into()
417 }
418
419 #[inline]
420 pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
421 self.raw.take()
422 }
423
424 pub fn truncate(&mut self, len: usize) {
425 let old_len = self.len();
426
427 if len > old_len {
429 return;
430 }
431
432 unsafe {
433 self.set_len(len);
434 self.raw.drop_elems_from_range(len..old_len);
435 }
436 }
437
438 #[inline]
439 pub fn clear(&mut self) {
440 let old_len = self.len();
441 unsafe {
442 self.set_len(0);
443 self.raw.drop_elems(old_len);
444 }
445 }
446
447 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
448 where F: FnMut() -> T,
449 {
450 let len = self.len();
451
452 if new_len > len {
453 self.extend(iter::repeat_with(f).take(new_len-len));
454 } else {
455 self.truncate(len);
456 }
457 }
458
459 pub fn leak(mut self) -> &'static mut [T] {
460 let len = self.len();
461
462 if len == 0 {
463 return Default::default();
464 }
465
466 self.raw.take()
467 .into_raw_rc()
468 .map(UniqRc::into_raw)
469 .map(|raw| {
470 unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
471 })
472 .unwrap_or_default()
473 }
474
475 pub fn iter(&self) -> slice::Iter<'_, T> {
476 self.into_iter()
477 }
478
479 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
480 self.into_iter()
481 }
482}
483
484#[rc_impl_gen_arc_impl]
485impl<T: Clone> RcVec<T> {
486 pub fn resize(&mut self, new_len: usize, value: T) {
487 let len = self.len();
488
489 if new_len > len {
490 self.extend(iter::repeat_n(value, new_len-len));
491 } else {
492 self.truncate(len);
493 }
494 }
495
496 pub fn extend_from_slice(&mut self, buf: &[T]) {
497 self.reserve(buf.len());
498
499 for ele in buf {
500 let len = self.len();
501 let ele = ele.clone();
502
503 unsafe {
504 self.as_mut_ptr().add(len).write(ele);
505 self.set_len(len + 1);
506 }
507 }
508 }
509
510 pub fn extend_from_within<R>(&mut self, src: R)
511 where R: RangeBounds<usize>,
512 {
513 let range = utils::range(src, ..self.len());
514 self.reserve(range.len());
515
516 let (this, spare, len) = unsafe {
517 self.split_at_spare_mut_with_len()
518 };
519
520 let to_clone = unsafe { this.get_unchecked(range) };
521
522 to_clone.iter().zip(spare)
523 .map(|(src, dst)| dst.write(src.clone()))
524 .for_each(|_| *len += 1);
525 }
526}
527
528#[rc_impl_gen_arc_impl]
529impl<T> RcVec<T> {
530 #[doc(hidden)]
532 #[allow(unused)]
533 pub fn from_elem(elem: T, len: usize) -> Self
534 where T: Clone,
535 {
536 Self::from_iter(iter::repeat_n(elem, len))
537 }
538
539 #[doc(hidden)]
541 #[allow(unused)]
542 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
543 arr.into()
544 }
545}