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