sfs_core/array/
view.rs

1//! Array views.
2
3use super::{
4    shape::{RemovedAxis, Strides},
5    Array, Shape,
6};
7
8mod iter;
9pub use iter::Iter;
10
11/// A view of an array along a particular axis.
12///
13/// See [`Array::get_axis`], [`Array::index_axis`], and [`Array::iter_axis`] for methods to obtain
14/// axis views.
15#[derive(Debug, PartialEq)]
16pub struct View<'a, T> {
17    data: &'a [T], // first element is first element in view
18    shape: RemovedAxis<'a, Shape>,
19    strides: RemovedAxis<'a, Strides>,
20}
21
22impl<'a, T> Clone for View<'a, T> {
23    fn clone(&self) -> Self {
24        *self
25    }
26}
27
28impl<'a, T> Copy for View<'a, T> {}
29
30impl<'a, T> View<'a, T> {
31    /// Returns the number of dimensions of the view.
32    pub fn dimensions(&self) -> usize {
33        self.shape.len()
34    }
35
36    /// Returns an iterator over the elements in the view in row-major order.
37    pub fn iter(&self) -> Iter<'_, T> {
38        Iter::new(*self)
39    }
40
41    pub(crate) fn new_unchecked(
42        data: &'a [T],
43        shape: RemovedAxis<'a, Shape>,
44        strides: RemovedAxis<'a, Strides>,
45    ) -> Self {
46        Self {
47            data,
48            shape,
49            strides,
50        }
51    }
52
53    /// Returns an owned array corresponding to the view.
54    pub fn to_array(&self) -> Array<T>
55    where
56        T: Clone,
57    {
58        let data = Vec::from_iter(self.iter().cloned());
59        let shape = Shape(self.shape.iter().copied().collect());
60
61        Array::new_unchecked(data, shape)
62    }
63}