array_object/convert/
from_integer.rs1use crate::adaptor::*;
2use crate::convert::zigzag::Zigzag;
3use crate::error::ArrayObjectError;
4use crate::misc::Product;
5use crate::storage::*;
6
7macro_rules! from_unsigned_integer {
8 ($($ty:ty),*) => {
9 $(
10 impl From<$ty> for ArrayObject {
11 fn from(val: $ty) -> Self {
12 let data = val.to_le_bytes().to_vec();
13 Self {
14 data,
15 shape: vec![],
16 datatype: DataType::UnsignedInteger,
17 }
18 }
19 }
20 impl From<&$ty> for ArrayObject {
21 fn from(val: &$ty) -> Self {
22 let data = val.to_le_bytes().to_vec();
23 Self {
24 data,
25 shape: vec![],
26 datatype: DataType::UnsignedInteger,
27 }
28 }
29 }
30 impl From<Vec<$ty>> for ArrayObject {
31 fn from(val: Vec<$ty>) -> Self {
32 let shape = vec![val.len() as u64];
33 let mut data = Vec::<u8>::with_capacity(size_of::<$ty>() * val.len());
34 for v in val {
35 data.append(&mut v.to_le_bytes().to_vec());
36 }
37 Self {
38 data,
39 shape,
40 datatype: DataType::UnsignedInteger,
41 }
42 }
43 }
44 impl From<&Vec<$ty>> for ArrayObject {
45 fn from(val: &Vec<$ty>) -> Self {
46 let shape = vec![val.len() as u64];
47 let mut data = Vec::<u8>::with_capacity(size_of::<$ty>() * val.len());
48 for v in val {
49 data.append(&mut v.to_le_bytes().to_vec());
50 }
51 Self {
52 data,
53 shape,
54 datatype: DataType::UnsignedInteger,
55 }
56 }
57 }
58 impl<const N: usize> From<[$ty; N]> for ArrayObject {
59 fn from(val: [$ty; N]) -> Self {
60 val.to_vec().into()
61 }
62 }
63 impl From<&[$ty]> for ArrayObject {
64 fn from(val: &[$ty]) -> Self {
65 val.to_vec().into()
66 }
67 }
68 impl TryFrom<VecShape<$ty>> for ArrayObject {
69 type Error = ArrayObjectError;
70 fn try_from(VecShape(val, shape): VecShape<$ty>) -> Result<Self, Self::Error> {
71 if val.len() != shape.product() as usize {
72 return Err(ArrayObjectError::NumberOfElementsMismatch(val.len(), shape.product() as usize));
73 }
74 if shape.len() > 15 {
75 return Err(ArrayObjectError::TooLargeDimension(shape.len()));
76 }
77 let mut temp: ArrayObject = val.into();
78 temp.shape = shape;
79 Ok(temp)
80 }
81 }
82 )*
83 };
84}
85
86from_unsigned_integer!(u8, u16, u32, u64, u128, usize);
87
88macro_rules! from_signed_integer {
89 ($($ty:ty),*) => {
90 $(
91 impl From<$ty> for ArrayObject {
92 fn from(val: $ty) -> Self {
93 let data = val.zigzag().to_le_bytes().to_vec();
94 Self {
95 data,
96 shape: vec![],
97 datatype: DataType::SignedInteger,
98 }
99 }
100 }
101 impl From<Vec<$ty>> for ArrayObject {
102 fn from(val: Vec<$ty>) -> Self {
103 let shape = vec![val.len() as u64];
104 let mut data = Vec::<u8>::with_capacity(size_of::<$ty>() * val.len());
105 for v in val {
106 data.append(&mut v.zigzag().to_le_bytes().to_vec());
107 }
108 Self {
109 data,
110 shape,
111 datatype: DataType::SignedInteger,
112 }
113 }
114 }
115 impl TryFrom<VecShape<$ty>> for ArrayObject {
116 type Error = ArrayObjectError;
117 fn try_from(VecShape(val, shape): VecShape<$ty>) -> Result<Self, Self::Error> {
118 if val.len() != shape.product() as usize {
119 return Err(ArrayObjectError::NumberOfElementsMismatch(val.len(), shape.product() as usize));
120 }
121 if shape.len() > 15 {
122 return Err(ArrayObjectError::TooLargeDimension(shape.len()));
123 }
124 let mut temp: ArrayObject = val.into();
125 temp.shape = shape;
126 Ok(temp)
127 }
128 }
129 )*
130 };
131}
132
133from_signed_integer!(i8, i16, i32, i64, i128, isize);