#![allow(clippy::absurd_extreme_comparisons)]
pub mod dispatch;
mod ops;
#[cfg(test)]
mod tests;
use crate::{Backend, Result, TruenoError};
#[derive(Debug, Clone, PartialEq)]
pub struct Vector<T> {
data: Vec<T>,
backend: Backend,
}
impl<T> Vector<T>
where
T: Clone,
{
pub fn from_slice(data: &[T]) -> Self {
Self { data: data.to_vec(), backend: crate::select_best_available_backend() }
}
pub fn from_vec(data: Vec<T>) -> Self {
Self { data, backend: crate::select_best_available_backend() }
}
pub fn from_slice_with_backend(data: &[T], backend: Backend) -> Self {
let resolved_backend = match backend {
Backend::Auto => crate::select_best_available_backend(),
other => other,
};
Self { data: data.to_vec(), backend: resolved_backend }
}
}
impl Vector<f32> {
pub fn with_alignment(size: usize, backend: Backend, alignment: usize) -> Result<Self> {
if alignment == 0 || (alignment & (alignment - 1)) != 0 {
return Err(TruenoError::InvalidInput(format!(
"Alignment must be power of 2, got {}",
alignment
)));
}
let resolved_backend = match backend {
Backend::Auto => crate::select_best_available_backend(),
other => other,
};
let data = vec![0.0f32; size];
let ptr = data.as_ptr() as usize;
let actual_alignment = ptr & !(ptr - 1);
if alignment > actual_alignment {
eprintln!(
"Note: Requested {}-byte alignment, got {}-byte alignment. Using unaligned loads.",
alignment, actual_alignment
);
}
Ok(Self { data, backend: resolved_backend })
}
}
impl<T> Vector<T>
where
T: Clone,
{
pub fn as_slice(&self) -> &[T] {
&self.data
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn backend(&self) -> Backend {
self.backend
}
}