use crate::DenseTensorData;
use crate::reorder::flat_index;
impl<T> DenseTensorData<T>
where
T: Clone,
{
pub fn get(&self, indices: &[usize]) -> T {
let shape = self.shape();
assert_eq!(indices.len(), shape.len());
for (axis, (&idx, &dim)) in indices.iter().zip(shape).enumerate() {
assert!(
idx < dim,
"index {idx} out of bounds for axis {axis} with size {dim}"
);
}
let order = self.order();
let idx = flat_index(indices, shape, order);
self.storage().data()[idx].clone()
}
pub fn set(&mut self, indices: &[usize], value: T) {
let idx = {
let shape = self.shape();
assert_eq!(indices.len(), shape.len());
for (axis, (&i, &dim)) in indices.iter().zip(shape).enumerate() {
assert!(
i < dim,
"index {i} out of bounds for axis {axis} with size {dim}"
);
}
flat_index(indices, shape, self.order())
};
self.storage_mut().data_mut()[idx] = value;
}
pub fn data_mut(&mut self) -> &mut [T] {
self.storage_mut().data_mut()
}
pub fn iter(&self) -> std::slice::Iter<'_, T> {
self.storage().data().iter()
}
pub fn fill(&mut self, value: T) {
self.storage_mut().fill(value);
}
pub fn scale<S>(&mut self, factor: S)
where
T: std::ops::Mul<S, Output = T>,
S: Clone,
{
self.storage_mut().scale(factor);
}
pub fn map_mut<F>(&mut self, f: F)
where
F: Fn(&T) -> T,
{
self.storage_mut().map_mut(f);
}
}