tea_core/vec_core/cores/
own.rs1use tea_dtype::IsNone;
2use tea_error::*;
3
4use super::super::trusted::{ToTrustIter, TrustedLen};
5use super::super::uninit::{UninitRefMut, UninitVec};
6use super::{Vec1Mut, Vec1View};
7
8pub 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 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 {}