1#![allow(clippy::len_without_is_empty)]
2
3use serde::{de::Deserializer, ser::Serializer, Deserialize, Serialize};
4use std::{
5 cmp::Ordering, fmt::{self, Debug}, hash::{Hash, Hasher}, iter::FromIterator, mem::ManuallyDrop, ops::{Deref, DerefMut}, panic::{RefUnwindSafe, UnwindSafe}
6};
7
8use super::{util::IteratorExt, AmadeusOrd, Data};
9use amadeus_core::{
10 par_sink::{ExtendReducer, FromDistributedStream, FromParallelStream, PushReducer}, pool::ProcessSend
11};
12
13pub struct List<T: Data> {
14 vec: T::Vec,
15}
16impl<T: Data> List<T> {
17 #[inline(always)]
18 pub fn new() -> Self {
19 Self {
20 vec: ListVec::new(),
21 }
22 }
23 #[inline(always)]
24 pub fn new_with(type_: T::DynamicType) -> Self {
25 let vec = T::new_vec(type_);
26 Self { vec }
27 }
28 #[inline(always)]
29 pub fn from_(vec: T::Vec) -> Self {
30 Self { vec }
31 }
32 #[inline(always)]
33 pub fn push(&mut self, t: T) {
34 self.vec.push(t)
35 }
36 #[inline(always)]
37 pub fn len(&self) -> usize {
38 self.vec.len()
39 }
40 #[inline(always)]
41 pub fn is_empty(&self) -> bool {
42 self.len() == 0
43 }
44 #[inline(always)]
45 pub fn into_boxed_slice(self) -> Box<[T]> {
46 self.vec.into_vec().into_boxed_slice()
47 }
48 #[inline(always)]
53 pub fn map<F, U: Data>(self, f: F) -> List<U>
54 where
55 F: FnMut(T) -> U,
56 {
57 self.into_iter().map(f).collect()
59 }
60 #[inline(always)]
61 pub fn try_map<F, U: Data, E>(self, f: F) -> Result<List<U>, E>
62 where
63 F: FnMut(T) -> Result<U, E>,
64 {
65 self.into_iter().map(f).collect()
67 }
68}
69impl<T: Data> Default for List<T> {
70 #[inline(always)]
71 fn default() -> Self {
72 Self::new()
73 }
74}
75impl<T: Data> From<Vec<T>> for List<T> {
76 #[inline(always)]
77 fn from(vec: Vec<T>) -> Self {
78 let vec = ListVec::from_vec(vec);
79 Self { vec }
80 }
81}
82impl<T: Data> From<List<T>> for Vec<T> {
83 #[inline(always)]
84 fn from(list: List<T>) -> Self {
85 list.vec.into_vec()
86 }
87}
88impl<T: Data> From<Box<[T]>> for List<T> {
89 #[inline(always)]
90 fn from(s: Box<[T]>) -> Self {
91 s.into_vec().into()
92 }
93}
94impl<T: Data> IntoIterator for List<T> {
95 type Item = T;
96 type IntoIter = <<T as Data>::Vec as ListVec<T>>::IntoIter;
97
98 #[inline(always)]
99 fn into_iter(self) -> Self::IntoIter {
100 <T as Data>::Vec::into_iter_a(self.vec)
101 }
102}
103impl<T: Data> FromIterator<T> for List<T> {
113 #[inline(always)]
114 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
115 Vec::from_iter(iter).into()
116 }
117}
118impl<T: Data> Extend<T> for List<T> {
119 #[inline(always)]
120 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
121 for el in iter {
122 self.push(el);
123 }
124 }
125}
126impl<T: Data> Clone for List<T>
127where
128 T: Clone,
129{
130 #[inline(always)]
131 fn clone(&self) -> Self {
132 Self {
133 vec: self.vec.clone_a(),
134 }
135 }
136}
137impl<T: Data, U: Data> PartialEq<List<U>> for List<T>
138where
139 T: PartialEq<U>,
140{
141 #[inline(always)]
142 fn eq(&self, other: &List<U>) -> bool {
143 self.clone()
144 .into_iter()
145 .eq_by_(other.clone().into_iter(), |a, b| a.eq(&b))
146 }
147}
148impl<T: Data> Eq for List<T> where T: Eq {}
149impl<T: Data, U: Data> PartialOrd<List<U>> for List<T>
150where
151 T: PartialOrd<U>,
152{
153 #[inline(always)]
154 fn partial_cmp(&self, other: &List<U>) -> Option<Ordering> {
155 self.clone()
156 .into_iter()
157 .partial_cmp_by_(other.clone().into_iter(), |a, b| a.partial_cmp(&b))
158 }
159}
160impl<T: Data> Ord for List<T>
161where
162 T: Ord,
163{
164 #[inline(always)]
165 fn cmp(&self, other: &Self) -> Ordering {
166 self.clone()
167 .into_iter()
168 .cmp_by_(other.clone().into_iter(), |a, b| a.cmp(&b))
169 }
170}
171impl<T: Data> AmadeusOrd for List<T>
172where
173 T: AmadeusOrd,
174{
175 #[inline(always)]
176 fn amadeus_cmp(&self, other: &Self) -> Ordering {
177 self.clone()
178 .into_iter()
179 .cmp_by_(other.clone().into_iter(), |a, b| a.amadeus_cmp(&b))
180 }
181}
182impl<T: Data> Hash for List<T>
183where
184 T: Hash,
185{
186 #[inline(always)]
187 fn hash<H>(&self, state: &mut H)
188 where
189 H: Hasher,
190 {
191 self.vec.hash_a(state)
192 }
193}
194impl<T: Data> Serialize for List<T>
195where
196 T: Serialize,
197{
198 #[inline(always)]
199 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
200 where
201 S: Serializer,
202 {
203 self.vec.serialize_a(serializer)
204 }
205}
206impl<'de, T: Data> Deserialize<'de> for List<T>
207where
208 T: Deserialize<'de>,
209{
210 #[inline(always)]
211 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
212 where
213 D: Deserializer<'de>,
214 {
215 <<T as Data>::Vec>::deserialize_a(deserializer).map(|vec| Self { vec })
216 }
217}
218impl<T: Data> Debug for List<T>
219where
220 T: Debug,
221{
222 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
223 self.vec.fmt_a(fmt)
224 }
225}
226impl<T: Data> UnwindSafe for List<T> where T: UnwindSafe {}
227impl<T: Data> RefUnwindSafe for List<T> where T: RefUnwindSafe {}
228impl<T: Data> Unpin for List<T> where T: Unpin {}
229#[allow(unsafe_code)]
231unsafe impl<T: Data> Send for List<T> where T: Send {}
232#[allow(unsafe_code)]
233unsafe impl<T: Data> Sync for List<T> where T: Sync {}
234
235impl Deref for List<u8> {
236 type Target = [u8];
237
238 #[inline(always)]
239 fn deref(&self) -> &Self::Target {
240 &*self.vec
241 }
242}
243impl DerefMut for List<u8> {
244 #[inline(always)]
245 fn deref_mut(&mut self) -> &mut Self::Target {
246 &mut *self.vec
247 }
248}
249
250#[derive(PartialEq, Eq, PartialOrd)]
251pub struct ValueRef<'a, T>(ManuallyDrop<T>, &'a ());
252impl<'a, T> Deref for ValueRef<'a, T> {
253 type Target = T;
254
255 #[inline(always)]
256 fn deref(&self) -> &Self::Target {
257 &*self.0
258 }
259}
260
261#[doc(hidden)]
262pub trait ListVec<T>
263where
264 T: Data,
265{
266 type IntoIter: Iterator<Item = T>;
267
268 fn new() -> Self;
269 fn push(&mut self, t: T);
270 fn pop(&mut self) -> Option<T>;
271 fn len(&self) -> usize;
272 fn from_vec(vec: Vec<T>) -> Self;
273 fn into_vec(self) -> Vec<T>;
274 fn into_iter_a(self) -> Self::IntoIter;
275 fn clone_a(&self) -> Self
277 where
278 T: Clone;
279 fn hash_a<H>(&self, state: &mut H)
280 where
281 H: Hasher,
282 T: Hash;
283 fn serialize_a<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
284 where
285 S: Serializer,
286 T: Serialize;
287 fn deserialize_a<'de, D>(deserializer: D) -> Result<Self, D::Error>
288 where
289 D: Deserializer<'de>,
290 T: Deserialize<'de>,
291 Self: Sized;
292 fn fmt_a(&self, fmt: &mut fmt::Formatter) -> fmt::Result
293 where
294 T: Debug;
295}
296impl<T: Data> ListVec<T> for Vec<T> {
297 type IntoIter = std::vec::IntoIter<T>;
298
299 #[inline(always)]
300 fn new() -> Self {
301 Self::new()
302 }
303 #[inline(always)]
304 fn push(&mut self, t: T) {
305 self.push(t)
306 }
307 #[inline(always)]
308 fn pop(&mut self) -> Option<T> {
309 self.pop()
310 }
311 #[inline(always)]
312 fn len(&self) -> usize {
313 self.len()
314 }
315 #[inline(always)]
316 fn from_vec(vec: Vec<T>) -> Self {
317 vec
318 }
319 #[inline(always)]
320 fn into_vec(self) -> Vec<T> {
321 self
322 }
323 #[inline(always)]
324 fn into_iter_a(self) -> Self::IntoIter {
325 self.into_iter()
326 }
327 #[inline(always)]
332 fn clone_a(&self) -> Self
333 where
334 T: Clone,
335 {
336 self.clone()
337 }
338 #[inline(always)]
339 fn hash_a<H>(&self, state: &mut H)
340 where
341 H: Hasher,
342 T: Hash,
343 {
344 self.hash(state)
345 }
346 #[inline(always)]
347 fn serialize_a<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
348 where
349 S: Serializer,
350 T: Serialize,
351 {
352 self.serialize(serializer)
353 }
354 #[inline(always)]
355 fn deserialize_a<'de, D>(deserializer: D) -> Result<Self, D::Error>
356 where
357 D: Deserializer<'de>,
358 T: Deserialize<'de>,
359 Self: Sized,
360 {
361 Self::deserialize(deserializer)
362 }
363 fn fmt_a(&self, fmt: &mut fmt::Formatter) -> fmt::Result
364 where
365 T: Debug,
366 {
367 self.fmt(fmt)
368 }
369}
370impl<T: Data> FromParallelStream<T> for List<T>
386where
387 T: Send + 'static,
388{
389 type ReduceA = PushReducer<T, Self>;
390 type ReduceC = ExtendReducer<Self>;
391
392 fn reducers() -> (Self::ReduceA, Self::ReduceC) {
393 Default::default()
394 }
395}
396
397impl<T: Data> FromDistributedStream<T> for List<T>
398where
399 T: ProcessSend + 'static,
400{
401 type ReduceA = PushReducer<T, Self>;
402 type ReduceB = ExtendReducer<Self>;
403 type ReduceC = ExtendReducer<Self>;
404
405 fn reducers() -> (Self::ReduceA, Self::ReduceB, Self::ReduceC) {
406 Default::default()
407 }
408}
409
410#[cfg(test)]
411mod test {
412 use super::*;
413 use crate::Value;
414
415 #[test]
416 fn test() {
417 let mut list: List<u8> = List::new();
418 list.push(0_u8);
419 list.push(1_u8);
420 println!("{:#?}", list);
421 let mut list: List<Value> = List::new();
422 list.push(Value::U8(0));
423 list.push(Value::U8(1));
424 println!("{:#?}", list);
425 let mut list: List<Value> = List::new_with(crate::value::ValueType::U8);
426 list.push(Value::U8(0));
427 list.push(Value::U8(1));
428 println!("{:#?}", list);
429 let mut list2: List<List<Value>> = List::new();
430 list2.push(list.clone());
431 list2.push(list);
432 println!("{:#?}", list2);
433 }
438}