1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use crate::imp::structs::qv::Qv;
use crate::imp::structs::rust_param::RustParam;
use crate::imp::structs::array_type::ArrayType;
use crate::error::CoreResult;
use crate::imp::structs::util::identity_equal_trait::IdentityEqual;
use std::sync::Arc;

#[derive(Debug, Clone)]
pub struct RustArray{
    array : Box<Qv<Vec<RustParam>>>,
}

impl RustArray{
    pub(crate) fn new(qv : Qv<Vec<RustParam>>) -> RustArray{
        RustArray{ array : Box::new(qv) }
    }

    pub(crate) fn from_int_array(qv : &Qv<RustIntArray>) -> RustArray{
        RustArray::new(qv.as_ref().map(|a| a.to_params()))
    }

    pub(crate) fn from_float_array(qv : &Qv<RustFloatArray>) -> RustArray{
        RustArray::new(qv.as_ref().map(|a| a.to_params()))
    }

    pub(crate) fn from_binary(qv : &Qv<RustBinary>) -> RustArray{
        RustArray::new(qv.as_ref().map(|a| a.to_params()))
    }

    pub(crate) fn qv(&self) -> &Qv<Vec<RustParam>>{ self.array.as_ref() }

    pub(crate) fn to_float_array(&self) -> Option<Qv<RustFloatArray>>{
        self.qv().opt_map(|a| RustFloatArray::from_params(a))
    }

    pub(crate) fn to_int_array(&self) -> Option<Qv<RustIntArray>>{
        self.qv().opt_map(|a| RustIntArray::from_params(a))
    }

    pub(crate) fn to_binary(&self) -> Option<Qv<RustBinary>>{
        self.qv().opt_map(|a| RustBinary::from_params(a))
    }

    pub(crate) fn to_param(&self, at : &ArrayType) -> CoreResult<RustParam>{
        Ok(match at{
            ArrayType::Float =>{ RustParam::FloatArray(self.to_float_array().ok_or("FloatArray is not valid")?) },
            ArrayType::Int =>{ RustParam::IntArray(self.to_int_array().ok_or("IntArray is not valid")?) },
            ArrayType::Binary =>{ RustParam::Binary(self.to_binary().ok_or("Binary is not valid")?) },
            //ArrayType::String =>{ RustParam::StrArray(self.to_str_array()?)}
            //ArrayType::Num2 =>{ RustParam::Num2Array(self.to_num2_array()?)}
        })
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct RustFloatArray{
    b : Box<Vec<f64>>,
}

impl RustFloatArray{
    pub fn new(b : Vec<f64>) -> RustFloatArray{ RustFloatArray{ b : Box::new(b) }}
    //pub(crate) fn as_ref(&self) -> &Vec<f64>{ self.b.as_ref() }
    pub(crate) fn to_params(&self) -> Vec<RustParam>{
        self.vec().iter().map(|a| RustParam::Float(Qv::Val(*a))).collect()
    }
    pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustFloatArray>{
        let op  = v.iter().map(|p| p.to_float()).collect::<Option<Vec<f64>>>();
        Some(RustFloatArray::new(op?))
    }
    pub fn vec(&self) -> &Vec<f64>{ self.b.as_ref() }
    pub fn vec_mut(&mut self) -> &mut Vec<f64>{ self.b.as_mut() }
}

impl IdentityEqual for RustFloatArray{
    fn identity_eq(&self, other: &Self) -> bool {
        self.b == other.b
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct RustIntArray{
    b : Arc<Vec<i64>>,
}

impl RustIntArray{
    pub fn new(b : Vec<i64>) -> RustIntArray{ RustIntArray{ b : Arc::new(b) }}
    //pub(crate) fn as_ref(&self) -> &Vec<i64>{ self.b.as_ref() }
    pub(crate) fn to_params(&self) -> Vec<RustParam>{
        self.vec().iter().map(|a| RustParam::Int(Qv::Val(*a))).collect()
    }
    pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustIntArray>{
        let op  = v.iter().map(|p| p.to_int()).collect::<Option<Vec<i64>>>();
        Some(RustIntArray::new(op?))
    }
    pub fn vec(&self) -> &Vec<i64>{ self.b.as_ref() }
    pub fn vec_mut(&mut self) -> &mut Vec<i64>{ Arc::make_mut(&mut self.b) }
}

impl IdentityEqual for RustIntArray{
    fn identity_eq(&self, other: &Self) -> bool {
        Arc::ptr_eq(&self.b, &other.b)
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct RustBinary{
    b : Arc<Vec<u8>>,
}

impl RustBinary{
    pub fn new(b : Vec<u8>) -> RustBinary{ RustBinary{ b : Arc::new(b)} }

    pub(crate) fn to_params(&self) -> Vec<RustParam>{
        self.vec().iter().map(|a| RustParam::Int(Qv::Val(*a as i64))).collect()
    }
    pub(crate) fn from_params(v : &Vec<RustParam>) -> Option<RustBinary>{
        let op  = v.iter().map(|p| p.to_u8()).collect::<Option<Vec<u8>>>();
        Some(RustBinary::new(op?))
    }
    pub fn vec(&self) -> &Vec<u8>{ self.b.as_ref() }
    pub fn arc(&self) -> &Arc<Vec<u8>>{ &self.b }
    pub fn vec_mut(&mut self) -> &mut Vec<u8>{
        //Arcが複数インスタンスある場合、Vecをコピーしてから&mutを返す(なんて便利なのだ・・・
        Arc::make_mut(&mut self.b)
    }
}

impl IdentityEqual for RustBinary{
    fn identity_eq(&self, other: &Self) -> bool {
        Arc::ptr_eq(&self.b, &other.b)
    }
}