mod dimensions;
#[cfg(feature = "link")]
mod memory;
#[cfg(all(feature = "ndarray", target_pointer_width = "64"))]
mod ndarray;
use crate::labview_layout;
#[cfg(feature = "link")]
pub use crate::memory::OwnedUHandle;
use crate::memory::{LVCopy, UHandle};
pub use dimensions::LVArrayDims;
#[cfg(feature = "link")]
pub use memory::NumericArrayResizable;
labview_layout!(
pub struct LVArray<const D: usize, T> {
dim_sizes: LVArrayDims<D>,
#[cfg(target_pointer_width = "64")]
data: [T],
#[cfg(target_pointer_width = "32")]
data: T,
}
);
impl<const D: usize, T> LVCopy for LVArray<D, T> {}
impl<const D: usize, T> LVArray<D, T> {
#[cfg(target_pointer_width = "32")]
pub fn dimension_sizes(&self) -> LVArrayDims<D> {
let mut dimensions = [0i32; D];
for (index, value) in dimensions.iter_mut().enumerate() {
let element_ptr = std::ptr::addr_of!(self.dim_sizes.0[index]);
let dim_size = unsafe { std::ptr::read_unaligned(element_ptr) };
*value = dim_size;
}
dimensions.into()
}
#[cfg(target_pointer_width = "64")]
pub fn dimension_sizes(&self) -> LVArrayDims<D> {
self.dim_sizes
}
pub fn element_count(&self) -> usize {
self.dimension_sizes().element_count()
}
pub unsafe fn get_value_unchecked(&self, index: usize) -> T {
let data_ptr = std::ptr::addr_of!(self.data) as *const T;
let element_ptr = data_ptr.add(index);
std::ptr::read_unaligned(element_ptr)
}
pub unsafe fn set_value_unchecked(&mut self, index: usize, value: T) {
let data_ptr = std::ptr::addr_of_mut!(self.data) as *mut T;
let element_ptr = data_ptr.add(index);
std::ptr::write_unaligned(element_ptr, value);
}
}
#[cfg(target_pointer_width = "64")]
impl<const D: usize, T> LVArray<D, T> {
pub fn data_as_slice(&self) -> &[T] {
let size = self.element_count();
unsafe { std::slice::from_raw_parts(self.data.as_ptr(), size) }
}
pub fn data_as_slice_mut(&mut self) -> &mut [T] {
let size = self.element_count();
unsafe { std::slice::from_raw_parts_mut(self.data.as_mut_ptr(), size) }
}
}
pub type LVArrayHandle<'a, const D: usize, T> = UHandle<'a, LVArray<D, T>>;
#[cfg(feature = "link")]
pub type LVArrayOwned<const D: usize, T> = OwnedUHandle<LVArray<D, T>>;