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 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}