1#[cfg(doc)]
2use alloc::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]
21pub struct RcVec<T> {
22 raw: RcRawVec<T>,
23 len: usize,
24}
25
26#[rc_impl_gen_arc_impl]
27impl<T> Deref for RcVec<T> {
28 type Target = [T];
29
30 fn deref(&self) -> &Self::Target {
31 let ptr = self.raw.as_ptr();
32 unsafe { slice::from_raw_parts(ptr, self.len) }
33 }
34}
35
36#[rc_impl_gen_arc_impl]
37impl<T> DerefMut for RcVec<T> {
38 fn deref_mut(&mut self) -> &mut Self::Target {
39 let ptr = self.raw.as_mut_ptr();
40 unsafe { slice::from_raw_parts_mut(ptr, self.len) }
41 }
42}
43
44#[rc_impl_gen_arc_impl]
45impl<T> Drop for RcVec<T> {
46 fn drop(&mut self) {
47 self.raw.drop_elems(self.len);
48 }
49}
50
51#[rc_impl_gen_arc_impl]
52impl<T> From<UniqRc<[T]>> for RcVec<T> {
53 fn from(value: UniqRc<[T]>) -> Self {
54 let len = value.len();
55 let raw = RcRawVec::from_uniq_slice(value);
56 Self { raw, len }
57 }
58}
59
60#[rc_impl_gen_arc_impl]
61impl<T> Default for RcVec<T> {
62 fn default() -> Self {
63 Self::new()
64 }
65}
66
67#[rc_impl_gen_arc_impl]
68impl<T> RcVec<T> {
69 pub fn new() -> Self {
80 Self { raw: RcRawVec::new(), len: 0 }
81 }
82
83 pub fn with_capacity(capacity: usize) -> Self {
84 Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
85 }
86
87 #[inline]
88 pub fn as_ptr(&self) -> *const T {
89 self.raw.as_ptr()
90 }
91
92 #[inline]
93 pub fn as_mut_ptr(&mut self) -> *mut T {
94 self.raw.as_mut_ptr()
95 }
96
97 #[inline]
98 pub fn len(&self) -> usize {
99 self.len
100 }
101
102 #[inline]
103 pub fn is_empty(&self) -> bool {
104 self.len() == 0
105 }
106
107 #[inline]
108 pub fn capacity(&self) -> usize {
109 self.raw.capacity()
110 }
111
112 #[inline]
113 pub fn push(&mut self, value: T) {
114 if self.len == self.capacity() {
115 self.raw.reserve_for_push(self.len);
116 }
117
118 unsafe {
119 let end = self.as_mut_ptr().add(self.len);
120 end.write(value);
121 self.len += 1;
122 }
123 }
124
125 pub fn reserve(&mut self, additional: usize) {
126 self.raw.reserve(self.len, additional);
127 }
128
129 pub fn reserve_exact(&mut self, additional: usize) {
130 self.raw.reserve_exact(self.len, additional);
131 }
132
133 #[inline]
134 pub fn pop(&mut self) -> Option<T> {
135 if self.len == 0 {
136 None
137 } else {
138 unsafe {
139 self.len -= 1;
140 Some(self.as_ptr().add(self.len).read())
141 }
142 }
143 }
144
145 #[inline]
146 #[track_caller]
147 pub fn remove(&mut self, index: usize) -> T {
148 fn assert_failed(index: usize, len: usize) -> ! {
149 panic!("remove index (is {index}) should be < len (is {len})")
150 }
151
152 let len = self.len();
153 if index >= len {
154 assert_failed(index, len);
155 }
156
157 unsafe {
158 let ret;
159 {
160 let ptr = self.as_mut_ptr().add(index);
161 ret = ptr.read();
162 ptr::copy(ptr.add(1), ptr, len - index - 1);
163 }
164 self.set_len(len - 1);
165 ret
166 }
167 }
168
169 #[inline]
170 #[track_caller]
171 pub fn swap_remove(&mut self, index: usize) -> T {
172 fn assert_failed(index: usize, len: usize) -> ! {
173 panic!("swap_remove index (is {index}) should be < len (is {len})")
174 }
175
176 let len = self.len();
177 if index >= len {
178 assert_failed(index, len);
179 }
180
181 unsafe {
182 let value = self.as_ptr().add(index).read();
183 let ptr = self.as_mut_ptr();
184 ptr.add(index).copy_from(ptr.add(len-1), 1);
185 self.set_len(len-1);
186 value
187 }
188 }
189
190 pub fn shrink_to_fit(&mut self) {
191 if self.capacity() > self.len() {
192 self.raw.shrink_to_fit(self.len());
193 }
194 }
195
196 pub fn shrink_to(&mut self, min_capacity: usize) {
197 if self.capacity() > min_capacity {
198 self.raw.shrink_to_fit(max(self.len(), min_capacity));
199 }
200 }
201
202 #[inline]
207 pub unsafe fn set_len(&mut self, new_len: usize) {
208 self.len = new_len;
209 }
210
211 #[inline]
235 pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
236 &mut self.raw.slice_mut()[self.len..]
237 }
238
239 unsafe fn split_at_spare_mut_with_len(
240 &mut self,
241 ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
242 let (initialized, spare)
243 = self.raw.slice_mut().split_at_mut(self.len);
244 let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
245 let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
246
247 (initialized, spare, &mut self.len)
248 }
249
250 #[inline]
253 pub unsafe fn from_raw_uniq_slice(
254 slice: UniqRc<[MaybeUninit<T>]>,
255 len: usize,
256 ) -> Self {
257 Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
258 }
259
260 pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
261 slice.into()
262 }
263
264 #[inline]
265 pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
266 self.raw.take().into_rc()
267 }
268
269 #[inline]
270 pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
271 self.raw.take().into_raw_rc()
272 }
273
274 #[inline]
275 pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
276 self.shrink_to_fit();
277 let len = self.len();
278 debug_assert_eq!(len, self.capacity());
279
280 let raw = UniqRc::into_raw(self.raw.take().into_rc());
281 let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
282 unsafe { UniqRc::from_raw_unchecked(slice) }
283 }
284
285 #[inline]
286 pub fn into_rc_slice(self) -> Rc<[T]> {
287 self.into_uniq_slice().into()
288 }
289
290 #[inline]
291 pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
292 self.raw.take()
293 }
294
295 pub fn truncate(&mut self, len: usize) {
296 let old_len = self.len();
297
298 if len > old_len {
300 return;
301 }
302
303 unsafe {
304 self.set_len(len);
305 self.raw.drop_elems_from_range(len..old_len);
306 }
307 }
308
309 #[inline]
310 pub fn clear(&mut self) {
311 let old_len = self.len();
312 unsafe {
313 self.set_len(0);
314 self.raw.drop_elems(old_len);
315 }
316 }
317
318 pub fn resize_with<F>(&mut self, new_len: usize, f: F)
319 where F: FnMut() -> T,
320 {
321 let len = self.len();
322
323 if new_len > len {
324 self.extend(iter::repeat_with(f).take(new_len-len));
325 } else {
326 self.truncate(len);
327 }
328 }
329
330 pub fn leak(mut self) -> &'static mut [T] {
331 let len = self.len();
332
333 if len == 0 {
334 return Default::default();
335 }
336
337 self.raw.take()
338 .into_raw_rc()
339 .map(UniqRc::into_raw)
340 .map(|raw| {
341 unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
342 })
343 .unwrap_or_default()
344 }
345
346 pub fn iter(&self) -> slice::Iter<'_, T> {
347 self.into_iter()
348 }
349
350 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
351 self.into_iter()
352 }
353}
354
355#[rc_impl_gen_arc_impl]
356impl<T: Clone> RcVec<T> {
357 pub fn resize(&mut self, new_len: usize, value: T) {
358 let len = self.len();
359
360 if new_len > len {
361 self.extend(iter::repeat_n(value, new_len-len));
362 } else {
363 self.truncate(len);
364 }
365 }
366
367 pub fn extend_from_slice(&mut self, buf: &[T]) {
368 self.reserve(buf.len());
369
370 for ele in buf {
371 let len = self.len();
372 let ele = ele.clone();
373
374 unsafe {
375 self.as_mut_ptr().add(len).write(ele);
376 self.set_len(len + 1);
377 }
378 }
379 }
380
381 pub fn extend_from_within<R>(&mut self, src: R)
382 where R: RangeBounds<usize>,
383 {
384 let range = utils::range(src, ..self.len());
385 self.reserve(range.len());
386
387 let (this, spare, len) = unsafe {
388 self.split_at_spare_mut_with_len()
389 };
390
391 let to_clone = unsafe { this.get_unchecked(range) };
392
393 to_clone.iter().zip(spare)
394 .map(|(src, dst)| dst.write(src.clone()))
395 .for_each(|_| *len += 1);
396 }
397}
398
399#[rc_impl_gen_arc_impl]
400impl<T> RcVec<T> {
401 #[doc(hidden)]
403 #[allow(unused)]
404 pub fn from_elem(elem: T, len: usize) -> Self
405 where T: Clone,
406 {
407 Self::from_iter(iter::repeat_n(elem, len))
408 }
409
410 #[doc(hidden)]
412 #[allow(unused)]
413 pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
414 arr.into()
415 }
416}