use crate::c_api::mts_array_t;
use crate::data::origin::get_data_origin;
use super::Array;
#[derive(Debug, Clone, Copy)]
pub struct ArrayRef<'a> {
array: mts_array_t,
marker: std::marker::PhantomData<&'a mts_array_t>,
}
impl<'a> ArrayRef<'a> {
pub unsafe fn from_raw(array: mts_array_t) -> ArrayRef<'a> {
ArrayRef {
array,
marker: std::marker::PhantomData,
}
}
#[inline]
pub fn as_any(&self) -> &dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any();
}
}
#[inline]
pub fn to_any(self) -> &'a dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any();
}
}
#[inline]
pub fn as_array(&self) -> &ndarray::ArrayD<f64> {
self.as_any().downcast_ref().expect("this is not a ndarray::ArrayD")
}
#[inline]
pub fn to_array(self) -> &'a ndarray::ArrayD<f64> {
self.to_any().downcast_ref().expect("this is not a ndarray::ArrayD")
}
pub fn as_raw(&self) -> &mts_array_t {
&self.array
}
}
#[derive(Debug)]
pub struct ArrayRefMut<'a> {
array: mts_array_t,
marker: std::marker::PhantomData<&'a mut mts_array_t>,
}
impl<'a> ArrayRefMut<'a> {
#[inline]
pub unsafe fn new(array: mts_array_t) -> ArrayRefMut<'a> {
ArrayRefMut {
array,
marker: std::marker::PhantomData,
}
}
#[inline]
pub fn as_any(&self) -> &dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any();
}
}
#[inline]
pub fn to_any(&self) -> &'a dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any();
}
}
#[inline]
pub fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any_mut();
}
}
#[inline]
pub fn to_any_mut(self) -> &'a mut dyn std::any::Any {
let origin = self.array.origin().unwrap_or(0);
assert_eq!(
origin, *super::array::RUST_DATA_ORIGIN,
"this array was not created as a rust Array (origin is '{}')",
get_data_origin(origin).unwrap_or_else(|_| "unknown".into())
);
let array = self.array.ptr.cast::<Box<dyn Array>>();
unsafe {
return (*array).as_any_mut();
}
}
#[inline]
pub fn as_array(&self) -> &ndarray::ArrayD<f64> {
self.as_any().downcast_ref().expect("this is not a ndarray::ArrayD")
}
#[inline]
pub fn to_array(&self) -> &ndarray::ArrayD<f64> {
self.to_any().downcast_ref().expect("this is not a ndarray::ArrayD")
}
#[inline]
pub fn as_array_mut(&mut self) -> &mut ndarray::ArrayD<f64> {
self.as_any_mut().downcast_mut().expect("this is not a ndarray::ArrayD")
}
#[inline]
pub fn to_array_mut(self) -> &'a mut ndarray::ArrayD<f64> {
self.to_any_mut().downcast_mut().expect("this is not a ndarray::ArrayD")
}
pub fn as_raw(&self) -> &mts_array_t {
&self.array
}
pub fn as_raw_mut(&mut self) -> &mut mts_array_t {
&mut self.array
}
}