Skip to main content

feanor_math/seq/
step_by.rs

1use std::marker::PhantomData;
2
3use super::*;
4
5#[derive(Debug)]
6pub struct StepBy<V: VectorView<T>, T: ?Sized> {
7    base: V,
8    step_by: usize,
9    element: PhantomData<T>,
10}
11
12impl<V: VectorView<T>, T: ?Sized> StepBy<V, T> {
13    pub fn new(base: V, step_by: usize) -> Self {
14        assert!(step_by > 0);
15        Self {
16            base,
17            step_by,
18            element: PhantomData,
19        }
20    }
21}
22
23impl<V: Clone + VectorView<T>, T: ?Sized> Clone for StepBy<V, T> {
24    fn clone(&self) -> Self {
25        Self {
26            base: self.base.clone(),
27            step_by: self.step_by,
28            element: PhantomData,
29        }
30    }
31}
32
33impl<V: Copy + VectorView<T>, T: ?Sized> Copy for StepBy<V, T> {}
34
35impl<V: VectorView<T>, T: ?Sized> VectorView<T> for StepBy<V, T> {
36    fn len(&self) -> usize {
37        if self.base.len() == 0 {
38            0
39        } else {
40            (self.base.len() - 1) / self.step_by + 1
41        }
42    }
43
44    fn at(&self, i: usize) -> &T { self.base.at(i * self.step_by) }
45}
46
47impl<V: VectorViewMut<T>, T: ?Sized> VectorViewMut<T> for StepBy<V, T> {
48    fn at_mut(&mut self, i: usize) -> &mut T { self.base.at_mut(i * self.step_by) }
49}
50
51impl<V: SwappableVectorViewMut<T>, T: ?Sized> SwappableVectorViewMut<T> for StepBy<V, T> {
52    fn swap(&mut self, i: usize, j: usize) { self.base.swap(i * self.step_by, j * self.step_by) }
53}
54
55#[derive(Debug)]
56pub struct StepByFn<V: VectorFn<T>, T> {
57    base: V,
58    step_by: usize,
59    element: PhantomData<T>,
60}
61
62impl<V: VectorFn<T>, T> StepByFn<V, T> {
63    pub fn new(base: V, step_by: usize) -> Self {
64        assert!(step_by > 0);
65        Self {
66            base,
67            step_by,
68            element: PhantomData,
69        }
70    }
71}
72
73impl<V: Clone + VectorFn<T>, T> Clone for StepByFn<V, T> {
74    fn clone(&self) -> Self {
75        Self {
76            base: self.base.clone(),
77            step_by: self.step_by,
78            element: PhantomData,
79        }
80    }
81}
82
83impl<V: Copy + VectorFn<T>, T> Copy for StepByFn<V, T> {}
84
85impl<V: VectorFn<T>, T> VectorFn<T> for StepByFn<V, T> {
86    fn len(&self) -> usize {
87        if self.base.len() == 0 {
88            0
89        } else {
90            (self.base.len() - 1) / self.step_by + 1
91        }
92    }
93
94    fn at(&self, i: usize) -> T { self.base.at(i * self.step_by) }
95}
96
97#[test]
98fn test_step_by() {
99    let vec = [0, 1, 2, 3, 4, 5, 6, 7];
100    let zero: [i32; 0] = [];
101    assert_eq!(0, zero.step_by_view(1).len());
102    assert_eq!(4, vec.step_by_view(2).len());
103    assert_eq!(3, vec.step_by_view(3).len());
104    assert_eq!(6, *vec.step_by_view(2).at(3));
105    assert_eq!(0, *vec.step_by_view(3).at(0));
106    assert_eq!(3, *vec.step_by_view(3).at(1));
107}
108
109#[test]
110fn test_step_by_fn() {
111    let vec = [0, 1, 2, 3, 4, 5, 6, 7].into_copy_els();
112    let zero: CloneElFn<[i32; 0], _, _> = [].into_copy_els();
113    assert_eq!(0, zero.step_by_fn(1).len());
114    assert_eq!(4, vec.step_by_fn(2).len());
115    assert_eq!(3, vec.step_by_fn(3).len());
116    assert_eq!(6, vec.step_by_fn(2).at(3));
117    assert_eq!(0, vec.step_by_fn(3).at(0));
118    assert_eq!(3, vec.step_by_fn(3).at(1));
119}