conspire/math/tensor/rank_1/vec_2d/
mod.rs1use crate::math::{TensorRank0, TensorRank1Vec, TensorVec};
2use std::ops::{Index, IndexMut};
3
4#[derive(Clone, Debug)]
8pub struct TensorRank1Vec2D<const D: usize, const I: usize>(Vec<TensorRank1Vec<D, I>>);
9
10impl<const D: usize, const I: usize> FromIterator<TensorRank1Vec<D, I>> for TensorRank1Vec2D<D, I> {
11 fn from_iter<Ii: IntoIterator<Item = TensorRank1Vec<D, I>>>(into_iterator: Ii) -> Self {
12 Self(Vec::from_iter(into_iterator))
13 }
14}
15
16impl<const D: usize, const I: usize> Index<usize> for TensorRank1Vec2D<D, I> {
17 type Output = TensorRank1Vec<D, I>;
18 fn index(&self, index: usize) -> &Self::Output {
19 &self.0[index]
20 }
21}
22
23impl<const D: usize, const I: usize> IndexMut<usize> for TensorRank1Vec2D<D, I> {
24 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
25 &mut self.0[index]
26 }
27}
28
29impl<const D: usize, const I: usize> TensorVec for TensorRank1Vec2D<D, I> {
30 type Item = TensorRank1Vec<D, I>;
31 type Slice<'a> = &'a [&'a [[TensorRank0; D]]];
32 fn append(&mut self, other: &mut Self) {
33 self.0.append(&mut other.0)
34 }
35 fn is_empty(&self) -> bool {
36 self.0.is_empty()
37 }
38 fn len(&self) -> usize {
39 self.0.len()
40 }
41 fn new(slice: Self::Slice<'_>) -> Self {
42 slice
43 .iter()
44 .map(|slice_entry| Self::Item::new(*slice_entry))
45 .collect()
46 }
47 fn push(&mut self, item: Self::Item) {
48 self.0.push(item)
49 }
50 fn zero(len: usize) -> Self {
51 (0..len).map(|_| Self::Item::zero(0)).collect()
52 }
53}
54
55impl<const D: usize, const I: usize> TensorRank1Vec2D<D, I> {
69 pub fn iter(&self) -> impl Iterator<Item = &TensorRank1Vec<D, I>> {
70 self.0.iter()
71 }
72 pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut TensorRank1Vec<D, I>> {
73 self.0.iter_mut()
74 }
75}