rc_vec/
rc_vec.rs

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/// [`RcVec`] based on [`Rc`] and can be converted from Rc without allocation,
26/// just like [`Box`] is converted to [`Vec`]
27///
28/// # Examples
29///
30/// ```
31/// # use std::rc::Rc;
32/// use rc_vec::RcVec;
33///
34/// let rc: Rc<[i32]> = Rc::new([1, 2, 3]);
35/// let mut rc_vec = RcVec::from(rc);
36///
37/// assert_eq!(rc_vec, [1, 2, 3]);
38/// rc_vec.push(4);
39/// assert_eq!(rc_vec, [1, 2, 3, 4]);
40/// ```
41#[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    /// Create a new [`RcVec`]
98    ///
99    /// # Examples
100    ///
101    /// ```
102    /// # use rc_vec::RcVec;
103    /// let mut vec = RcVec::new();
104    /// vec.push(3);
105    /// assert_eq!(vec, [3]);
106    /// ```
107    pub fn new() -> Self {
108        Self { raw: RcRawVec::new(), len: 0 }
109    }
110
111    /// Create a new [`RcVec`] Initial capacity of `capacity`
112    ///
113    /// # Examples
114    ///
115    /// ```
116    /// # use rc_vec::RcVec;
117    /// let vec = RcVec::with_capacity(176);
118    /// assert_eq!(vec.capacity(), 176);
119    /// assert_eq!(vec.len(), 0);
120    /// # assert_ne!(vec, [1]);
121    /// ```
122    pub fn with_capacity(capacity: usize) -> Self {
123        Self { raw: RcRawVec::with_capacity(capacity), len: 0 }
124    }
125
126    /// Readonly permission pointer
127    #[inline]
128    pub fn as_ptr(&self) -> *const T {
129        self.raw.as_ptr()
130    }
131
132    /// Read and Write permission pointer
133    ///
134    /// # Examples
135    ///
136    /// ```
137    /// # use rc_vec::rc_vec;
138    /// let mut vec = rc_vec![1, 2, 3];
139    /// assert_eq!(vec, [1, 2, 3]);
140    /// unsafe { *vec.as_mut_ptr() += 1 }
141    /// assert_eq!(vec, [2, 2, 3]);
142    /// ```
143    #[inline]
144    pub fn as_mut_ptr(&mut self) -> *mut T {
145        self.raw.as_mut_ptr()
146    }
147
148    /// Extracts a slice containing the entire vector.
149    ///
150    /// Equivalent to `&s[..].`
151    ///
152    /// # Examples
153    ///
154    /// ```
155    /// # use rc_vec::rc_vec;
156    /// let vec = rc_vec![1, 2, 3];
157    /// let slice: &[i32] = vec.as_slice();
158    /// assert_eq!(slice, [1, 2, 3]);
159    /// ```
160    #[inline]
161    pub fn as_slice(&self) -> &[T] {
162        self
163    }
164
165    /// Extracts a mutable slice of the entire vector.
166    ///
167    /// Equivalent to `&mut s[..].`
168    ///
169    /// # Examples
170    ///
171    /// ```
172    /// # use rc_vec::rc_vec;
173    /// let mut vec = rc_vec![1, 2, 3];
174    /// let slice: &mut [i32] = vec.as_mut_slice();
175    /// assert_eq!(slice, [1, 2, 3]);
176    /// slice[1] += 2;
177    /// assert_eq!(slice, [1, 4, 3]);
178    /// ```
179    #[inline]
180    pub fn as_mut_slice(&mut self) -> &mut [T] {
181        self
182    }
183
184    /// Get initialized datas count
185    ///
186    /// # Examples
187    ///
188    /// ```
189    /// # use rc_vec::RcVec;
190    /// let mut vec = RcVec::with_capacity(4);
191    /// assert_eq!(vec.capacity(), 4);
192    ///
193    /// vec.push(2333);
194    ///
195    /// assert_eq!(vec.len(), 1);
196    /// assert_eq!(vec.capacity(), 4);
197    /// ```
198    #[inline]
199    pub fn len(&self) -> usize {
200        self.len
201    }
202
203    /// Like `.len() == 0`
204    #[inline]
205    pub fn is_empty(&self) -> bool {
206        self.len() == 0
207    }
208
209    /// Get allocated capacity
210    ///
211    /// # Examples
212    ///
213    /// ```
214    /// # use rc_vec::RcVec;
215    /// let vec = RcVec::with_capacity(176);
216    /// assert_eq!(vec.capacity(), 176);
217    /// assert_eq!(vec.len(), 0);
218    /// # assert_ne!(vec, [1]);
219    /// ```
220    #[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    pub fn pop_if<P>(&mut self, predicate: P) -> Option<T>
260    where P: FnOnce(&mut T) -> bool
261    {
262        let last = self.last_mut()?;
263
264        if predicate(last) {
265            self.pop()
266        } else {
267            None
268        }
269    }
270
271    #[inline]
272    #[track_caller]
273    pub fn remove(&mut self, index: usize) -> T {
274        fn assert_failed(index: usize, len: usize) -> ! {
275            panic!("remove index (is {index}) should be < len (is {len})")
276        }
277
278        let len = self.len();
279        if index >= len {
280            assert_failed(index, len);
281        }
282
283        unsafe {
284            let ret;
285            {
286                let ptr = self.as_mut_ptr().add(index);
287                ret = ptr.read();
288                ptr::copy(ptr.add(1), ptr, len - index - 1);
289            }
290            self.set_len(len - 1);
291            ret
292        }
293    }
294
295    /// Like [`Vec::insert`]
296    ///
297    /// # Panics
298    ///
299    /// - `index > self.len()`
300    ///
301    /// # Examples
302    ///
303    /// ```
304    /// # use rc_vec::rc_vec;
305    /// let mut vec = rc_vec![1, 2, 3];
306    /// vec.insert(1, 4);
307    /// assert_eq!(vec, [1, 4, 2, 3]);
308    /// vec.insert(4, 5);
309    /// assert_eq!(vec, [1, 4, 2, 3, 5]);
310    /// ```
311    #[track_caller]
312    pub fn insert(&mut self, index: usize, element: T) {
313        #[cold]
314        #[inline(never)]
315        #[track_caller]
316        fn assert_failed(index: usize, len: usize) -> ! {
317            panic!("insertion index (is {index}) should be <= len (is {len})");
318        }
319
320        let len = self.len();
321
322        if len == self.capacity() {
323            self.reserve(1);
324        }
325
326        unsafe {
327            let p = self.as_mut_ptr().add(index);
328
329            if index < len {
330                ptr::copy(p, p.add(1), len - index);
331            } else if index == len {
332                // no move
333            } else {
334                assert_failed(index, len);
335            }
336
337            ptr::write(p, element);
338
339            self.set_len(len + 1);
340        }
341    }
342
343    #[inline]
344    #[track_caller]
345    pub fn swap_remove(&mut self, index: usize) -> T {
346        fn assert_failed(index: usize, len: usize) -> ! {
347            panic!("swap_remove index (is {index}) should be < len (is {len})")
348        }
349
350        let len = self.len();
351        if index >= len {
352            assert_failed(index, len);
353        }
354
355        unsafe {
356            let value = self.as_ptr().add(index).read();
357            let ptr = self.as_mut_ptr();
358            ptr.add(index).copy_from(ptr.add(len-1), 1);
359            self.set_len(len-1);
360            value
361        }
362    }
363
364    /// Reallocate to remove excess capacity
365    ///
366    /// # Examples
367    ///
368    /// ```
369    /// # use rc_vec::RcVec;
370    /// let mut vec = RcVec::with_capacity(16);
371    /// vec.push(233);
372    /// assert_eq!(vec.len(), 1);
373    /// assert_eq!(vec.capacity(), 16);
374    ///
375    /// vec.shrink_to_fit();
376    /// assert_eq!(vec.len(), 1);
377    /// assert_eq!(vec.capacity(), 1);
378    /// ```
379    pub fn shrink_to_fit(&mut self) {
380        if self.capacity() > self.len() {
381            self.raw.shrink_to_fit(self.len());
382        }
383    }
384
385    /// Reallocate to max(`min_capacity`, `.len()`)
386    pub fn shrink_to(&mut self, min_capacity: usize) {
387        if self.capacity() > min_capacity {
388            self.raw.shrink_to_fit(max(self.len(), min_capacity));
389        }
390    }
391
392    /// Like [`Vec::set_len`]
393    ///
394    /// # Safety
395    /// See [`Vec::set_len`] for safety concerns and examples.
396    #[inline]
397    pub unsafe fn set_len(&mut self, new_len: usize) {
398        self.len = new_len;
399    }
400
401    /// Like [`Vec::spare_capacity_mut`]
402    ///
403    /// # Examples
404    ///
405    /// ```
406    /// # use rc_vec::RcVec;
407    /// # use std::mem::MaybeUninit;
408    /// let mut vec = RcVec::with_capacity(4);
409    ///
410    /// vec.push(0);
411    /// assert_eq!(*vec, [0]);
412    ///
413    /// let spare = vec.spare_capacity_mut();
414    /// assert_eq!(spare.len(), 3);
415    /// spare[0] = MaybeUninit::new(1);
416    /// assert_eq!(*vec, [0]);
417    ///
418    /// unsafe {
419    ///     // SAFETY: The initialized data has been written to spare
420    ///     vec.set_len(vec.len() + 1);
421    /// }
422    /// assert_eq!(*vec, [0, 1]);
423    /// ```
424    #[inline]
425    pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>] {
426        &mut self.raw.slice_mut()[self.len..]
427    }
428
429    unsafe fn split_at_spare_mut_with_len(
430        &mut self,
431    ) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
432        let (initialized, spare)
433            = self.raw.slice_mut().split_at_mut(self.len);
434        let initialized_ptr = initialized.as_mut_ptr().cast::<T>();
435        let initialized = slice::from_raw_parts_mut(initialized_ptr, self.len);
436
437        (initialized, spare, &mut self.len)
438    }
439
440    /// # Safety
441    /// `slice` `0..len` must be initialized
442    #[inline]
443    pub unsafe fn from_raw_uniq_slice(
444        slice: UniqRc<[MaybeUninit<T>]>,
445        len: usize,
446    ) -> Self {
447        Self { raw: RcRawVec::from_raw_uniq_slice(slice), len }
448    }
449
450    pub fn from_uniq_slice(slice: UniqRc<[T]>) -> Self {
451        slice.into()
452    }
453
454    #[inline]
455    pub fn into_raw_uniq_slice(mut self) -> UniqRc<[MaybeUninit<T>]> {
456        self.raw.take().into_rc()
457    }
458
459    #[inline]
460    pub fn into_raw_uniq_slice_optional(mut self) -> Option<UniqRc<[MaybeUninit<T>]>> {
461        self.raw.take().into_raw_rc()
462    }
463
464    #[inline]
465    pub fn into_uniq_slice(mut self) -> UniqRc<[T]> {
466        self.shrink_to_fit();
467        let len = self.len();
468        debug_assert_eq!(len, self.capacity());
469
470        let raw = UniqRc::into_raw(self.raw.take().into_rc());
471        let slice = ptr::slice_from_raw_parts_mut(raw.cast::<T>(), len);
472        unsafe { UniqRc::from_raw_unchecked(slice) }
473    }
474
475    #[inline]
476    pub fn into_rc_slice(self) -> Rc<[T]> {
477        self.into_uniq_slice().into()
478    }
479
480    #[inline]
481    pub(crate) fn into_raw_vec(mut self) -> RcRawVec<T> {
482        self.raw.take()
483    }
484
485    pub fn truncate(&mut self, len: usize) {
486        let old_len = self.len();
487
488        // NOTE: use `>`, reference from Vec::truncate
489        if len > old_len {
490            return;
491        }
492
493        unsafe {
494            self.set_len(len);
495            self.raw.drop_elems_from_range(len..old_len);
496        }
497    }
498
499    #[inline]
500    pub fn clear(&mut self) {
501        let old_len = self.len();
502        unsafe {
503            self.set_len(0);
504            self.raw.drop_elems(old_len);
505        }
506    }
507
508    pub fn resize_with<F>(&mut self, new_len: usize, f: F)
509    where F: FnMut() -> T,
510    {
511        let len = self.len();
512
513        if new_len > len {
514            self.extend(iter::repeat_with(f).take(new_len-len));
515        } else {
516            self.truncate(len);
517        }
518    }
519
520    pub fn leak(mut self) -> &'static mut [T] {
521        let len = self.len();
522
523        if len == 0 {
524            return Default::default();
525        }
526
527        self.raw.take()
528            .into_raw_rc()
529            .map(UniqRc::into_raw)
530            .map(|raw| {
531                unsafe { slice::from_raw_parts_mut(raw.cast::<T>(), len) }
532            })
533            .unwrap_or_default()
534    }
535
536    /// Like [`Vec::drain`]
537    ///
538    /// # Examples
539    ///
540    /// ```
541    /// # use rc_vec::{RcVec, rc_vec};
542    /// let mut v = rc_vec![1, 2, 3];
543    /// let u: RcVec<_> = v.drain(1..).collect();
544    /// assert_eq!(v, &[1]);
545    /// assert_eq!(u, &[2, 3]);
546    ///
547    /// // Like `clear()`
548    /// v.drain(..);
549    /// assert_eq!(v, &[]);
550    /// ```
551    pub fn drain<R>(&mut self, range: R) -> RcVecDrain<'_, T>
552    where R: RangeBounds<usize>,
553    {
554        let len = self.len();
555        let Range { start, end } = utils::range(range, ..len);
556
557        unsafe {
558            self.set_len(start);
559
560            let slice = slice::from_raw_parts(
561                self.as_ptr().add(start),
562                end - start,
563            );
564
565            RcVecDrain {
566                tail_start: end,
567                tail_len: len - end,
568                iter: slice.iter(),
569                vec: self.into(),
570            }
571        }
572    }
573
574    /// Like [`Vec::append`]
575    ///
576    /// # Examples
577    ///
578    /// ```
579    /// # use rc_vec::{RcVec, rc_vec};
580    /// let mut vec = rc_vec![1, 2, 3];
581    /// let mut vec2 = rc_vec![4, 5, 6];
582    /// vec.append(&mut vec2);
583    /// assert_eq!(vec, [1, 2, 3, 4, 5, 6]);
584    /// assert_eq!(vec2, []);
585    /// ```
586    #[inline]
587    pub fn append(&mut self, other: &mut Self) {
588        let count = other.len();
589        let len = self.len();
590
591        unsafe {
592            self.reserve(count);
593
594            let dst = self.as_mut_ptr().add(len);
595            ptr::copy_nonoverlapping(other.as_ptr(), dst, count);
596
597            self.set_len(len+count);
598            other.set_len(0);
599        }
600    }
601
602    /// Like [`Vec::split_off`]
603    ///
604    /// # Panics
605    /// - `at > len`
606    ///
607    /// # Examples
608    ///
609    /// ```
610    /// # use rc_vec::{RcVec, rc_vec};
611    /// let mut vec = rc_vec![1, 2, 3];
612    /// let vec2 = vec.split_off(1);
613    /// assert_eq!(vec, [1]);
614    /// assert_eq!(vec2, [2, 3]);
615    /// ```
616    pub fn split_off(&mut self, at: usize) -> Self {
617        #[cold]
618        #[inline(never)]
619        fn assert_failed(at: usize, len: usize) -> ! {
620            panic!("`at` split index (is {at}) should be <= len (is {len})");
621        }
622
623        if at > self.len() {
624            assert_failed(at, self.len());
625        }
626
627        let remainder_len = self.len() - at;
628        let mut other = Self::with_capacity(remainder_len);
629
630        unsafe {
631            self.set_len(at);
632            other.set_len(remainder_len);
633
634            self.as_ptr().add(at)
635                .copy_to(other.as_mut_ptr(), other.len());
636        }
637
638        other
639    }
640
641    #[inline]
642    pub fn iter(&self) -> slice::Iter<'_, T> {
643        self.into_iter()
644    }
645
646    #[inline]
647    pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
648        self.into_iter()
649    }
650
651    /// Like [`Vec::retain`]
652    ///
653    /// # Examples
654    ///
655    /// ```
656    /// # use rc_vec::{RcVec, rc_vec};
657    /// let mut vec = rc_vec![1, 2, 3, 4];
658    /// vec.retain(|&x| x % 2 == 0);
659    /// assert_eq!(vec, [2, 4]);
660    /// ```
661    ///
662    /// ```
663    /// # use rc_vec::{RcVec, rc_vec};
664    /// let mut vec = rc_vec![1, 2, 3, 4, 5];
665    /// let keep = [false, true, true, false, true];
666    /// let mut iter = keep.iter();
667    /// vec.retain(|_| *iter.next().unwrap());
668    /// assert_eq!(vec, [2, 3, 5]);
669    /// ```
670    pub fn retain<F>(&mut self, mut f: F)
671    where F: FnMut(&T) -> bool,
672    {
673        self.retain_mut(|elem| f(elem));
674    }
675
676    /// Like [`Vec::retain_mut`]
677    pub fn retain_mut<F>(&mut self, mut f: F)
678    where F: FnMut(&mut T) -> bool,
679    {
680        // This implement code from alloc::vec
681
682        let original_len = self.len();
683        unsafe { self.set_len(0) };
684
685        struct ShiftGuard<'a, T> {
686            v: &'a mut RcVec<T>,
687            processed_len: usize,
688            deleted_cnt: usize,
689            original_len: usize,
690        }
691
692        impl<T> Drop for ShiftGuard<'_, T> {
693            fn drop(&mut self) {
694                if self.deleted_cnt > 0 {
695                    // SAFETY: 尾随的未检查项必须有效,因为我们从不碰它们。
696                    unsafe {
697                        ptr::copy(
698                            self.v.as_ptr().add(self.processed_len),
699                            self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt),
700                            self.original_len - self.processed_len,
701                        );
702                    }
703                }
704                // SAFETY: 填充完 holes 后,所有项都存储在连续的内存中。
705                unsafe {
706                    self.v.set_len(self.original_len - self.deleted_cnt);
707                }
708            }
709        }
710
711        let mut g = ShiftGuard {
712            v: self,
713            processed_len: 0,
714            deleted_cnt: 0,
715            original_len,
716        };
717
718        fn process_loop<F, T, const DELETED: bool>(
719            original_len: usize,
720            f: &mut F,
721            g: &mut ShiftGuard<'_, T>,
722        )
723        where F: FnMut(&mut T) -> bool,
724        {
725            while g.processed_len != original_len {
726                // SAFETY: 未经检查的元素必须有效。
727                let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) };
728                if !f(cur) {
729                    // 如果 `drop_in_place` 发生 panic,请提前提早避免双重丢弃
730                    g.processed_len += 1;
731                    g.deleted_cnt += 1;
732                    // SAFETY: 丢弃后,我们再也不会触碰此元素。
733                    unsafe { ptr::drop_in_place(cur) };
734                    // 我们已经提前了 counter。
735                    if DELETED {
736                        continue;
737                    } else {
738                        break;
739                    }
740                }
741                if DELETED {
742                    // SAFETY: `deleted_cnt`> 0,因此 hole 插槽不得与当前元素重叠
743                    // 我们使用 copy 进行移动,从此再也不会触碰此元素。
744                    unsafe {
745                        let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt);
746                        ptr::copy_nonoverlapping(cur, hole_slot, 1);
747                    }
748                }
749                g.processed_len += 1;
750            }
751        }
752
753        process_loop::<F, T, false>(original_len, &mut f, &mut g);
754        process_loop::<F, T, true>(original_len, &mut f, &mut g);
755        drop(g);
756    }
757}
758
759#[rc_impl_gen_arc_impl]
760impl<T: Clone> RcVec<T> {
761    pub fn resize(&mut self, new_len: usize, value: T) {
762        let len = self.len();
763
764        if new_len > len {
765            self.extend(iter::repeat_n(value, new_len-len));
766        } else {
767            self.truncate(len);
768        }
769    }
770
771    pub fn extend_from_slice(&mut self, buf: &[T]) {
772        self.reserve(buf.len());
773
774        for ele in buf {
775            let len = self.len();
776            let ele = ele.clone();
777
778            unsafe {
779                self.as_mut_ptr().add(len).write(ele);
780                self.set_len(len + 1);
781            }
782        }
783    }
784
785    pub fn extend_from_within<R>(&mut self, src: R)
786    where R: RangeBounds<usize>,
787    {
788        let range = utils::range(src, ..self.len());
789        self.reserve(range.len());
790
791        let (this, spare, len) = unsafe {
792            self.split_at_spare_mut_with_len()
793        };
794
795        let to_clone = unsafe { this.get_unchecked(range) };
796
797        to_clone.iter().zip(spare)
798            .map(|(src, dst)| dst.write(src.clone()))
799            .for_each(|_| *len += 1);
800    }
801}
802
803#[rc_impl_gen_arc_impl]
804impl<T> RcVec<T> {
805    /// Macro support
806    #[doc(hidden)]
807    #[allow(unused)]
808    pub fn from_elem(elem: T, len: usize) -> Self
809    where T: Clone,
810    {
811        Self::from_iter(iter::repeat_n(elem, len))
812    }
813
814    /// Macro support
815    #[doc(hidden)]
816    #[allow(unused)]
817    pub fn from_array<const N: usize>(arr: [T; N]) -> Self {
818        arr.into()
819    }
820}