feanor_math/seq/
step_by.rs1use 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}