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 #[inline]
235 #[track_caller]
236 pub fn swap_remove(&mut self, index: usize) -> T {
237 fn assert_failed(index: usize, len: usize) -> ! {
238 panic!("swap_remove index (is {index}) should be < len (is {len})")
239 }
240
241 let len = self.len();
242 if index >= len {
243 assert_failed(index, len);
244 }
245
246 unsafe {
247 let value = self.as_ptr().add(index).read();
248 let ptr = self.as_mut_ptr();
249 ptr.add(index).copy_from(ptr.add(len-1), 1);
250 self.set_len(len-1);
251 value
252 }
253 }
254
255 pub fn shrink_to_fit(&mut self) {
271 if self.capacity() > self.len() {
272 self.raw.shrink_to_fit(self.len());
273 }
274 }
275
276 pub fn shrink_to(&mut self, min_capacity: usize) {
278 if self.capacity() > min_capacity {
279 self.raw.shrink_to_fit(max(self.len(), min_capacity));
280 }
281 }
282
283 #[inline]
288 pub unsafe fn set_len(&mut self, new_len: usize) {
289 self.len = new_len;
290 }
291
292 #[inline]
316 pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
317 &mut self.raw.slice_mut()[self.len..]
318 }
319
320 unsafe fn split_at_spare_mut_with_len(
321 &mut self,
322 ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
323 let (initialized, spare)
324 = self.raw.slice_mut().split_at_mut(self.len);
325 let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
326 let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
327
328 (initialized, spare, &mut self.len)
329 }
330
331 #[inline]
334 pub unsafe fn from_raw_uniq_slice(
335 slice: UniqRc<[MaybeUninit<T>]>,
336 len: usize,
337 ) -> Self {
338 Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
339 }
340
341 pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
342 slice.into()
343 }
344
345 #[inline]
346 pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
347 self.raw.take().into_rc()
348 }
349
350 #[inline]
351 pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
352 self.raw.take().into_raw_rc()
353 }
354
355 #[inline]
356 pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
357 self.shrink_to_fit();
358 let len = self.len();
359 debug_assert_eq!(len, self.capacity());
360
361 let raw = UniqRc::into_raw(self.raw.take().into_rc());
362 let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
363 unsafe { UniqRc::from_raw_unchecked(slice) }
364 }
365
366 #[inline]
367 pub fn into_rc_slice(self) -> Rc<[T]> {
368 self.into_uniq_slice().into()
369 }
370
371 #[inline]
372 pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
373 self.raw.take()
374 }
375
376 pub fn truncate(&mut self, len: usize) {
377 let old_len = self.len();
378
379 if len > old_len {
381 return;
382 }
383
384 unsafe {
385 self.set_len(len);
386 self.raw.drop_elems_from_range(len..old_len);
387 }
388 }
389
390 #[inline]
391 pub fn clear(&mut self) {
392 let old_len = self.len();
393 unsafe {
394 self.set_len(0);
395 self.raw.drop_elems(old_len);
396 }
397 }
398
399 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
400 where F: FnMut() -> T,
401 {
402 let len = self.len();
403
404 if new_len > len {
405 self.extend(iter::repeat_with(f).take(new_len-len));
406 } else {
407 self.truncate(len);
408 }
409 }
410
411 pub fn leak(mut self) -> &'static mut [T] {
412 let len = self.len();
413
414 if len == 0 {
415 return Default::default();
416 }
417
418 self.raw.take()
419 .into_raw_rc()
420 .map(UniqRc::into_raw)
421 .map(|raw| {
422 unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
423 })
424 .unwrap_or_default()
425 }
426
427 pub fn iter(&self) -> slice::Iter<'_, T> {
428 self.into_iter()
429 }
430
431 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
432 self.into_iter()
433 }
434}
435
436#[rc_impl_gen_arc_impl]
437impl<T: Clone> RcVec<T> {
438 pub fn resize(&mut self, new_len: usize, value: T) {
439 let len = self.len();
440
441 if new_len > len {
442 self.extend(iter::repeat_n(value, new_len-len));
443 } else {
444 self.truncate(len);
445 }
446 }
447
448 pub fn extend_from_slice(&mut self, buf: &[T]) {
449 self.reserve(buf.len());
450
451 for ele in buf {
452 let len = self.len();
453 let ele = ele.clone();
454
455 unsafe {
456 self.as_mut_ptr().add(len).write(ele);
457 self.set_len(len + 1);
458 }
459 }
460 }
461
462 pub fn extend_from_within<R>(&mut self, src: R)
463 where R: RangeBounds<usize>,
464 {
465 let range = utils::range(src, ..self.len());
466 self.reserve(range.len());
467
468 let (this, spare, len) = unsafe {
469 self.split_at_spare_mut_with_len()
470 };
471
472 let to_clone = unsafe { this.get_unchecked(range) };
473
474 to_clone.iter().zip(spare)
475 .map(|(src, dst)| dst.write(src.clone()))
476 .for_each(|_| *len += 1);
477 }
478}
479
480#[rc_impl_gen_arc_impl]
481impl<T> RcVec<T> {
482 #[doc(hidden)]
484 #[allow(unused)]
485 pub fn from_elem(elem: T, len: usize) -> Self
486 where T: Clone,
487 {
488 Self::from_iter(iter::repeat_n(elem, len))
489 }
490
491 #[doc(hidden)]
493 #[allow(unused)]
494 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
495 arr.into()
496 }
497}