mod conversions;
#[cfg(feature = "cube")]
use crate::Cube;
#[cfg(feature = "matrix")]
use crate::Matrix;
#[cfg(feature = "scalar_type")]
use crate::Scalar;
use crate::{Array, FieldArray, Table, traits::custom_value::CustomValue};
use std::sync::Arc;
#[cfg(feature = "chunked")]
use crate::{SuperArray, SuperTable};
#[cfg(feature = "views")]
use crate::{ArrayV, TableV};
#[cfg(all(feature = "chunked", feature = "views"))]
use crate::{SuperArrayV, SuperTableV};
mod impls;
#[derive(Debug, Clone)]
pub enum Value {
#[cfg(feature = "scalar_type")]
Scalar(Scalar),
Array(Arc<Array>),
#[cfg(feature = "views")]
ArrayView(Arc<ArrayV>),
FieldArray(Arc<FieldArray>),
Table(Arc<Table>),
#[cfg(feature = "views")]
TableView(Arc<TableV>),
#[cfg(feature = "chunked")]
SuperArray(Arc<SuperArray>),
#[cfg(all(feature = "chunked", feature = "views"))]
SuperArrayView(Arc<SuperArrayV>),
#[cfg(feature = "chunked")]
SuperTable(Arc<SuperTable>),
#[cfg(all(feature = "chunked", feature = "views"))]
SuperTableView(Arc<SuperTableV>),
#[cfg(feature = "matrix")]
Matrix(Arc<Matrix>),
#[cfg(feature = "cube")]
Cube(Arc<Cube>),
VecValue(Arc<Vec<Value>>),
BoxValue(Box<Value>),
ArcValue(Arc<Value>),
Tuple2(Arc<(Value, Value)>),
Tuple3(Arc<(Value, Value, Value)>),
Tuple4(Arc<(Value, Value, Value, Value)>),
Tuple5(Arc<(Value, Value, Value, Value, Value)>),
Tuple6(Arc<(Value, Value, Value, Value, Value, Value)>),
Custom(Arc<dyn CustomValue>),
}
impl Value {
#[inline]
pub fn len(&self) -> usize {
match self {
#[cfg(feature = "scalar_type")]
Value::Scalar(_) => 1,
Value::Table(t) => t.n_rows,
#[cfg(feature = "views")]
Value::TableView(tv) => tv.len,
Value::Array(a) => a.len(),
#[cfg(feature = "views")]
Value::ArrayView(av) => av.array.len(),
Value::FieldArray(fa) => fa.array.len(),
#[cfg(feature = "chunked")]
Value::SuperArray(sa) => sa.len(),
#[cfg(all(feature = "chunked", feature = "views"))]
Value::SuperArrayView(sav) => sav.len(),
#[cfg(feature = "chunked")]
Value::SuperTable(st) => st.len(),
#[cfg(all(feature = "chunked", feature = "views"))]
Value::SuperTableView(stv) => stv.len,
#[cfg(feature = "matrix")]
Value::Matrix(m) => m.len(),
#[cfg(feature = "cube")]
Value::Cube(c) => c.len(),
Value::VecValue(vv) => vv.iter().map(|x| x.len()).sum(),
Value::BoxValue(bv) => bv.len(),
Value::ArcValue(av) => av.len(),
Value::Tuple2(t2) => t2.0.len() + t2.1.len(),
Value::Tuple3(t3) => t3.0.len() + t3.1.len() + t3.2.len(),
Value::Tuple4(t4) => t4.0.len() + t4.1.len() + t4.2.len() + t4.3.len(),
Value::Tuple5(t5) => t5.0.len() + t5.1.len() + t5.2.len() + t5.3.len() + t5.4.len(),
Value::Tuple6(t6) => {
t6.0.len() + t6.1.len() + t6.2.len() + t6.3.len() + t6.4.len() + t6.5.len()
}
Value::Custom(_cv) => panic!("Length is not implemented for custom value type."),
}
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
#[cfg(feature = "views")]
pub fn slice(&self, offset: usize, length: usize) -> Value {
match self {
#[cfg(feature = "scalar_type")]
Value::Scalar(s) => Value::Scalar(s.clone()),
Value::Table(t) => Value::TableView(Arc::new(t.slice(offset, length))),
Value::TableView(tv) => Value::TableView(Arc::new(tv.from_self(offset, length))),
Value::Array(a) => {
Value::ArrayView(Arc::new(ArrayV::new((**a).clone(), offset, length)))
}
Value::ArrayView(av) => Value::ArrayView(Arc::new(av.slice(offset, length))),
Value::FieldArray(fa) => {
Value::ArrayView(Arc::new(ArrayV::new(fa.array.clone(), offset, length)))
}
#[cfg(feature = "chunked")]
Value::SuperArray(sa) => Value::SuperArrayView(Arc::new(sa.slice(offset, length))),
#[cfg(all(feature = "chunked", feature = "views"))]
Value::SuperArrayView(sav) => {
Value::SuperArrayView(Arc::new(sav.slice(offset, length)))
}
#[cfg(feature = "chunked")]
Value::SuperTable(st) => Value::SuperTableView(Arc::new(st.view(offset, length))),
#[cfg(all(feature = "chunked", feature = "views"))]
Value::SuperTableView(stv) => {
Value::SuperTableView(Arc::new(stv.slice(offset, length)))
}
#[cfg(feature = "matrix")]
Value::Matrix(_) => unimplemented!("Matrix slicing"),
#[cfg(feature = "cube")]
Value::Cube(_) => unimplemented!("Cube slicing"),
Value::VecValue(v) => {
let end = (offset + length).min(v.len());
Value::VecValue(Arc::new(v[offset..end].to_vec()))
}
Value::BoxValue(bv) => bv.slice(offset, length),
Value::ArcValue(av) => av.slice(offset, length),
Value::Tuple2(t) => Value::Tuple2(Arc::new((
t.0.slice(offset, length),
t.1.slice(offset, length),
))),
Value::Tuple3(t) => Value::Tuple3(Arc::new((
t.0.slice(offset, length),
t.1.slice(offset, length),
t.2.slice(offset, length),
))),
Value::Tuple4(t) => Value::Tuple4(Arc::new((
t.0.slice(offset, length),
t.1.slice(offset, length),
t.2.slice(offset, length),
t.3.slice(offset, length),
))),
Value::Tuple5(t) => Value::Tuple5(Arc::new((
t.0.slice(offset, length),
t.1.slice(offset, length),
t.2.slice(offset, length),
t.3.slice(offset, length),
t.4.slice(offset, length),
))),
Value::Tuple6(t) => Value::Tuple6(Arc::new((
t.0.slice(offset, length),
t.1.slice(offset, length),
t.2.slice(offset, length),
t.3.slice(offset, length),
t.4.slice(offset, length),
t.5.slice(offset, length),
))),
Value::Custom(_) => panic!("Slicing is not implemented for custom value types."),
}
}
pub fn arity(&self) -> usize {
match self {
Value::Tuple2(_) => 2,
Value::Tuple3(_) => 3,
Value::Tuple4(_) => 4,
Value::Tuple5(_) => 5,
Value::Tuple6(_) => 6,
_ => 1,
}
}
}