tea_core/vec_core/cores/
own.rs

1use tea_dtype::IsNone;
2use tea_error::*;
3
4use super::super::trusted::{ToTrustIter, TrustedLen};
5use super::super::uninit::{UninitRefMut, UninitVec};
6use super::{Vec1Mut, Vec1View};
7
8/// a vector owns its data is not necessarily mutable
9pub trait Vec1<T>: Vec1View<T> + Sized {
10    type Uninit: UninitVec<T, Vec = Self>;
11    type UninitRefMut<'a>: UninitRefMut<T>
12    where
13        T: 'a;
14
15    fn collect_from_iter<I: Iterator<Item = T>>(iter: I) -> Self;
16
17    fn uninit(len: usize) -> Self::Uninit;
18
19    fn uninit_ref_mut(uninit_vec: &mut Self::Uninit) -> Self::UninitRefMut<'_>;
20
21    #[inline]
22    fn try_collect_from_iter<I: Iterator<Item = TResult<T>>>(iter: I) -> TResult<Self> {
23        Ok(Self::collect_from_iter(iter.map(|v| v.unwrap())))
24    }
25
26    #[inline]
27    fn collect_from_trusted<I: TrustedLen<Item = T>>(iter: I) -> Self {
28        Self::collect_from_iter(iter)
29    }
30
31    #[inline]
32    fn try_collect_from_trusted<I: TrustedLen<Item = TResult<T>>>(iter: I) -> TResult<Self>
33    where
34        T: std::fmt::Debug,
35    {
36        Self::try_collect_from_iter(iter)
37    }
38
39    #[inline]
40    fn collect_with_len<I: Iterator<Item = T>>(iter: I, len: usize) -> Self {
41        Self::collect_from_trusted(iter.to_trust(len))
42    }
43
44    #[inline]
45    fn collect_from_opt_iter<I: Iterator<Item = Option<T>>>(iter: I) -> Self
46    where
47        T: IsNone,
48    {
49        let iter = iter.map(|v| v.unwrap_or_else(T::none));
50        Self::collect_from_iter(iter)
51    }
52
53    #[inline]
54    fn empty() -> Self {
55        Self::collect_from_iter(std::iter::empty())
56    }
57
58    #[inline]
59    fn full(len: usize, v: T) -> Self
60    where
61        T: Clone,
62    {
63        let iter = std::iter::repeat_n(v, len);
64        Self::collect_from_trusted(iter)
65    }
66
67    /// sort 1d array using a compare function, but might not preserve the order of equal elements.
68    fn sort_unstable_by<'a, F>(&'a mut self, compare: F) -> TResult<()>
69    where
70        Self: Vec1Mut<'a, T>,
71        T: Clone,
72        F: FnMut(&T, &T) -> std::cmp::Ordering,
73    {
74        if let Some(slc) = self.try_as_slice_mut() {
75            slc.sort_unstable_by(compare);
76            Ok(())
77        } else {
78            let mut out_c: Vec<_> = self.titer().collect_trusted_vec1();
79            let slc = out_c.try_as_slice_mut().ok_or_else(|| {
80                terr!("This type of 1d vector can not be sorted by the given compare function")
81            })?;
82            slc.sort_unstable_by(compare);
83            self.apply_mut_with(&out_c, |v, vo| *v = vo)
84        }
85    }
86}
87
88pub trait Vec1Collect: IntoIterator {
89    #[inline]
90    fn collect_vec1<O: Vec1<Self::Item>>(self) -> O
91    where
92        Self: Sized,
93    {
94        O::collect_from_iter(self.into_iter())
95    }
96
97    #[inline]
98    fn collect_trusted_vec1<O: Vec1<Self::Item>>(self) -> O
99    where
100        Self: Sized,
101        Self::IntoIter: TrustedLen,
102    {
103        <O as Vec1<Self::Item>>::collect_from_trusted(self.into_iter())
104    }
105
106    #[inline]
107    fn collect_vec1_with_len<O: Vec1<Self::Item>>(self, len: usize) -> O
108    where
109        Self: Sized,
110    {
111        <O as Vec1<Self::Item>>::collect_with_len(self.into_iter(), len)
112    }
113}
114
115pub trait Vec1OptCollect<T: IsNone>: IntoIterator<Item = Option<T>> {
116    #[inline]
117    fn collect_vec1_opt<O: Vec1<T>>(self) -> O
118    where
119        Self: Sized,
120    {
121        <O as Vec1<T>>::collect_from_opt_iter(self.into_iter())
122    }
123}
124
125pub trait Vec1TryCollect<T: IsNone>: IntoIterator<Item = TResult<T>> {
126    #[inline]
127    fn try_collect_vec1<O: Vec1<T>>(self) -> TResult<O>
128    where
129        Self: Sized,
130    {
131        <O as Vec1<T>>::try_collect_from_iter(self.into_iter())
132    }
133
134    #[inline]
135    fn try_collect_trusted_vec1<O: Vec1<T>>(self) -> TResult<O>
136    where
137        T: std::fmt::Debug,
138        Self: Sized,
139        Self::IntoIter: TrustedLen,
140    {
141        <O as Vec1<T>>::try_collect_from_trusted(self.into_iter())
142    }
143}
144
145impl<T: IntoIterator + Sized> Vec1Collect for T {}
146impl<I: IntoIterator<Item = Option<T>>, T: IsNone> Vec1OptCollect<T> for I {}
147impl<I: IntoIterator<Item = TResult<T>>, T: IsNone + std::fmt::Debug> Vec1TryCollect<T> for I {}