docchi_core/imp/structs/
rust_array.rs1use crate::imp::structs::qv::Qv;
2use crate::imp::structs::rust_param::RustParam;
3use crate::imp::structs::array_type::ArrayType;
4use crate::error::CoreResult;
5use crate::imp::structs::util::identity_equal_trait::IdentityEqual;
6use std::sync::Arc;
7
8#[derive(Debug, Clone)]
9pub(crate) struct RustArray{
10 array : Box<Qv<Vec<RustParam>>>,
11}
12
13impl RustArray{
14 pub(crate) fn new(qv : Qv<Vec<RustParam>>) -> RustArray{
15 RustArray{ array : Box::new(qv) }
16 }
17
18 pub(crate) fn from_int_array(qv : &Qv<RustIntArray>) -> RustArray{
19 RustArray::new(qv.as_ref().map(|a| a.to_params()))
20 }
21
22 pub(crate) fn from_float_array(qv : &Qv<RustFloatArray>) -> RustArray{
23 RustArray::new(qv.as_ref().map(|a| a.to_params()))
24 }
25
26 pub(crate) fn from_binary(qv : &Qv<RustBinary>) -> RustArray{
27 RustArray::new(qv.as_ref().map(|a| a.to_params()))
28 }
29
30 pub(crate) fn qv(&self) -> &Qv<Vec<RustParam>>{ self.array.as_ref() }
31
32 pub(crate) fn to_float_array(&self) -> Option<Qv<RustFloatArray>>{
33 self.qv().opt_map(|a| RustFloatArray::from_params(a))
34 }
35
36 pub(crate) fn to_int_array(&self) -> Option<Qv<RustIntArray>>{
37 self.qv().opt_map(|a| RustIntArray::from_params(a))
38 }
39
40 pub(crate) fn to_binary(&self) -> Option<Qv<RustBinary>>{
41 self.qv().opt_map(|a| RustBinary::from_params(a))
42 }
43
44 pub(crate) fn to_param(&self, at : &ArrayType) -> CoreResult<RustParam>{
45 Ok(match at{
46 ArrayType::Float =>{ RustParam::FloatArray(self.to_float_array().ok_or("FloatArray is not valid")?) },
47 ArrayType::Int =>{ RustParam::IntArray(self.to_int_array().ok_or("IntArray is not valid")?) },
48 ArrayType::Binary =>{ RustParam::Binary(self.to_binary().ok_or("Binary is not valid")?) },
49 })
52 }
53}
54
55#[derive(Debug, Clone, PartialEq)]
56pub struct RustFloatArray{
57 b : Box<Vec<f64>>,
58}
59
60impl RustFloatArray{
61 pub fn new(b : Vec<f64>) -> RustFloatArray{ RustFloatArray{ b : Box::new(b) }}
62 pub(crate) fn to_params(&self) -> Vec<RustParam>{
64 self.vec().iter().map(|a| RustParam::Float(Qv::Val(*a))).collect()
65 }
66 pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustFloatArray>{
67 let op = v.iter().map(|p| p.to_float()).collect::<Option<Vec<f64>>>();
68 Some(RustFloatArray::new(op?))
69 }
70 pub fn vec(&self) -> &Vec<f64>{ self.b.as_ref() }
71 pub fn vec_mut(&mut self) -> &mut Vec<f64>{ self.b.as_mut() }
72}
73
74impl IdentityEqual for RustFloatArray{
75 fn identity_eq(&self, other: &Self) -> bool {
76 self.b == other.b
77 }
78}
79
80#[derive(Debug, Clone, PartialEq)]
81pub struct RustIntArray{
82 b : Arc<Vec<i64>>,
83}
84
85impl RustIntArray{
86 pub fn new(b : Vec<i64>) -> RustIntArray{ RustIntArray{ b : Arc::new(b) }}
87 pub(crate) fn to_params(&self) -> Vec<RustParam>{
89 self.vec().iter().map(|a| RustParam::Int(Qv::Val(*a))).collect()
90 }
91 pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustIntArray>{
92 let op = v.iter().map(|p| p.to_int()).collect::<Option<Vec<i64>>>();
93 Some(RustIntArray::new(op?))
94 }
95 pub fn vec(&self) -> &Vec<i64>{ self.b.as_ref() }
96 pub fn vec_mut(&mut self) -> &mut Vec<i64>{ Arc::make_mut(&mut self.b) }
97}
98
99impl IdentityEqual for RustIntArray{
100 fn identity_eq(&self, other: &Self) -> bool {
101 Arc::ptr_eq(&self.b, &other.b)
102 }
103}
104
105#[derive(Debug, Clone, PartialEq)]
106pub struct RustBinary{
107 b : Arc<Vec<u8>>,
108}
109
110impl RustBinary{
111 pub fn new(b : Vec<u8>) -> RustBinary{ RustBinary{ b : Arc::new(b)} }
112
113 pub(crate) fn to_params(&self) -> Vec<RustParam>{
114 self.vec().iter().map(|a| RustParam::Int(Qv::Val(*a as i64))).collect()
115 }
116 pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustBinary>{
117 let op = v.iter().map(|p| p.to_u8()).collect::<Option<Vec<u8>>>();
118 Some(RustBinary::new(op?))
119 }
120 pub fn vec(&self) -> &Vec<u8>{ self.b.as_ref() }
121 pub fn arc(&self) -> &Arc<Vec<u8>>{ &self.b }
122 pub fn vec_mut(&mut self) -> &mut Vec<u8>{
123 Arc::make_mut(&mut self.b)
125 }
126}
127
128impl IdentityEqual for RustBinary{
129 fn identity_eq(&self, other: &Self) -> bool {
130 Arc::ptr_eq(&self.b, &other.b)
131 }
132}