amadeus_types/
list.rs

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)]
49	// pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
50	// 	self.into_iter()
51	// }
52	#[inline(always)]
53	pub fn map<F, U: Data>(self, f: F) -> List<U>
54	where
55		F: FnMut(T) -> U,
56	{
57		// TODO
58		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		// TODO
66		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}
103// impl<'a, T: Data> IntoIterator for &'a List<T> {
104// 	type Item = &'a T;
105// 	type IntoIter = Box<dyn Iterator<Item = &'a T> + 'a>;
106
107// 	#[inline(always)]
108// 	fn into_iter(self) -> Self::IntoIter {
109// 		<T as Data>::Vec::iter_a(&self.vec)
110// 	}
111// }
112impl<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// Implementers of ListVec must be Send/Sync if T is Send/Sync!
230#[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 iter_a<'a>(&'a self) -> Box<dyn Iterator<Item = &'a T> + 'a>;
276	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)]
328	// fn iter_a<'a>(&'a self) -> Box<dyn Iterator<Item = &'a T> + 'a> {
329	// 	Box::new(self.iter())
330	// }
331	#[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}
370// #[doc(hidden)]
371// pub trait ListVecRef<'a, T: 'a> {
372// 	type IntoIter: Iterator<Item = &'a T>;
373
374// 	fn into_iter(self) -> Self::IntoIter;
375// }
376// impl<'a, T: 'a> ListVecRef<'a, T> for &'a Vec<T> {
377// 	type IntoIter = std::slice::Iter<'a, T>;
378
379// 	#[inline(always)]
380// 	fn into_iter(self) -> Self::IntoIter {
381// 		IntoIterator::into_iter(self)
382// 	}
383// }
384
385impl<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		// let mut list2: List<List<Value>> = List::new(type_coerce(Vec::<List<Value>>::new()));//List::<Value>::new(ValueVec::U8(List::new(type_coerce(Vec::<u8>::new()))))));
434		// list2.push(list.clone());
435		// list2.push(list.clone());
436		// println!("{:#?}", list);
437	}
438}