14 # use alg_tools::types::float; |
14 # use alg_tools::types::float; |
15 let cube : Cube<float, 2> = [[0.0, 1.0], [-1.0, 1.0]].into(); |
15 let cube : Cube<float, 2> = [[0.0, 1.0], [-1.0, 1.0]].into(); |
16 ``` |
16 ``` |
17 */ |
17 */ |
18 |
18 |
19 use serde::ser::{Serialize, Serializer, SerializeTupleStruct}; |
19 use serde::{Serialize, Deserialize}; |
20 use crate::types::*; |
20 use crate::types::*; |
21 use crate::loc::Loc; |
21 use crate::loc::Loc; |
22 use crate::sets::SetOrd; |
22 use crate::sets::SetOrd; |
23 use crate::maputil::{ |
23 use crate::maputil::{ |
24 FixedLength, |
24 FixedLength, |
28 map2, |
28 map2, |
29 }; |
29 }; |
30 |
30 |
31 /// A multi-dimensional cube $∏_{i=1}^N [a_i, b_i)$ with the starting and ending points |
31 /// A multi-dimensional cube $∏_{i=1}^N [a_i, b_i)$ with the starting and ending points |
32 /// along $a_i$ and $b_i$ along each dimension of type `U`. |
32 /// along $a_i$ and $b_i$ along each dimension of type `U`. |
33 #[derive(Copy, Clone, Debug, Eq, PartialEq)] |
33 #[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] |
34 pub struct Cube<U : Num, const N : usize>(pub(super) [[U; 2]; N]); |
34 #[serde(bound( |
35 |
35 serialize = "[[U; 2]; N] : Serialize", |
36 // Need to manually implement as [F; N] serialisation is provided only for some N. |
36 deserialize = "[[U; 2]; N] : for<'a> Deserialize<'a>", |
37 impl<F : Num + Serialize, const N : usize> Serialize for Cube<F, N> |
37 ))] |
38 where |
38 pub struct Cube<U : Num, const N : usize>( |
39 F: Serialize, |
39 pub(super) [[U; 2]; N] |
40 { |
40 ); |
41 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
|
42 where |
|
43 S: Serializer, |
|
44 { |
|
45 let mut ts = serializer.serialize_tuple_struct("Cube", N)?; |
|
46 for e in self.0.iter() { |
|
47 ts.serialize_field(e)?; |
|
48 } |
|
49 ts.end() |
|
50 } |
|
51 } |
|
52 |
41 |
53 impl<A : Num, const N : usize> FixedLength<N> for Cube<A,N> { |
42 impl<A : Num, const N : usize> FixedLength<N> for Cube<A,N> { |
54 type Iter = std::array::IntoIter<[A; 2], N>; |
43 type Iter = std::array::IntoIter<[A; 2], N>; |
55 type Elem = [A; 2]; |
44 type Elem = [A; 2]; |
56 #[inline] |
45 #[inline] |