Skip to main content

feanor_math/seq/
map.rs

1use std::marker::PhantomData;
2
3use super::{SwappableVectorViewMut, VectorFn, VectorView, VectorViewMut};
4
5pub struct VectorViewMap<V: VectorView<T>, T: ?Sized, U: ?Sized, F: for<'a> Fn(&'a T) -> &'a U> {
6    base: V,
7    mapping_fn: F,
8    elements: PhantomData<(*const T, *const U)>,
9}
10
11impl<V: Clone + VectorView<T>, T: ?Sized, U: ?Sized, F: Clone + for<'a> Fn(&'a T) -> &'a U> Clone
12    for VectorViewMap<V, T, U, F>
13{
14    fn clone(&self) -> Self {
15        Self {
16            mapping_fn: self.mapping_fn.clone(),
17            base: self.base.clone(),
18            elements: PhantomData,
19        }
20    }
21}
22
23impl<V: Copy + VectorView<T>, T: ?Sized, U: ?Sized, F: Copy + for<'a> Fn(&'a T) -> &'a U> Copy
24    for VectorViewMap<V, T, U, F>
25{
26}
27
28impl<V: VectorView<T>, T: ?Sized, U: ?Sized, F: for<'a> Fn(&'a T) -> &'a U> VectorViewMap<V, T, U, F> {
29    pub fn new(base: V, mapping_fn: F) -> Self {
30        Self {
31            base,
32            mapping_fn,
33            elements: PhantomData,
34        }
35    }
36}
37
38impl<V: VectorView<T>, T: ?Sized, U: ?Sized, F: for<'a> Fn(&'a T) -> &'a U> VectorView<U>
39    for VectorViewMap<V, T, U, F>
40{
41    fn at(&self, i: usize) -> &U { (self.mapping_fn)(self.base.at(i)) }
42
43    fn len(&self) -> usize { self.base.len() }
44}
45
46pub struct VectorViewMapMut<
47    V: VectorViewMut<T>,
48    T: ?Sized,
49    U: ?Sized,
50    F_const: for<'a> Fn(&'a T) -> &'a U,
51    F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U,
52> {
53    base: V,
54    mapping_fns: (F_const, F_mut),
55    elements: PhantomData<(*const T, *const U)>,
56}
57
58impl<
59    V: VectorViewMut<T>,
60    T: ?Sized,
61    U: ?Sized,
62    F_const: for<'a> Fn(&'a T) -> &'a U,
63    F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U,
64> VectorViewMapMut<V, T, U, F_const, F_mut>
65{
66    pub fn new(base: V, mapping_fns: (F_const, F_mut)) -> Self {
67        Self {
68            base,
69            mapping_fns,
70            elements: PhantomData,
71        }
72    }
73}
74
75impl<
76    V: VectorViewMut<T>,
77    T: ?Sized,
78    U: ?Sized,
79    F_const: for<'a> Fn(&'a T) -> &'a U,
80    F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U,
81> VectorView<U> for VectorViewMapMut<V, T, U, F_const, F_mut>
82{
83    fn at(&self, i: usize) -> &U { (self.mapping_fns.0)(self.base.at(i)) }
84
85    fn len(&self) -> usize { self.base.len() }
86}
87
88impl<
89    V: VectorViewMut<T>,
90    T: ?Sized,
91    U: ?Sized,
92    F_const: for<'a> Fn(&'a T) -> &'a U,
93    F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U,
94> VectorViewMut<U> for VectorViewMapMut<V, T, U, F_const, F_mut>
95{
96    fn at_mut(&mut self, i: usize) -> &mut U { (self.mapping_fns.1)(self.base.at_mut(i)) }
97}
98
99impl<
100    V: SwappableVectorViewMut<T>,
101    T: ?Sized,
102    U: ?Sized,
103    F_const: for<'a> Fn(&'a T) -> &'a U,
104    F_mut: for<'a> FnMut(&'a mut T) -> &'a mut U,
105> SwappableVectorViewMut<U> for VectorViewMapMut<V, T, U, F_const, F_mut>
106{
107    fn swap(&mut self, i: usize, j: usize) { self.base.swap(i, j) }
108}
109
110pub struct VectorFnMap<V: VectorFn<T>, T, U, F: Fn(T) -> U> {
111    base: V,
112    mapping_fn: F,
113    elements: PhantomData<(T, U)>,
114}
115
116impl<V: Clone + VectorFn<T>, T, U, F: Clone + Fn(T) -> U> Clone for VectorFnMap<V, T, U, F> {
117    fn clone(&self) -> Self {
118        Self {
119            mapping_fn: self.mapping_fn.clone(),
120            base: self.base.clone(),
121            elements: PhantomData,
122        }
123    }
124}
125
126impl<V: Copy + VectorFn<T>, T, U, F: Copy + Fn(T) -> U> Copy for VectorFnMap<V, T, U, F> {}
127
128impl<V: VectorFn<T>, T, U, F: Fn(T) -> U> VectorFnMap<V, T, U, F> {
129    pub fn new(base: V, mapping_fn: F) -> Self {
130        Self {
131            base,
132            mapping_fn,
133            elements: PhantomData,
134        }
135    }
136}
137
138impl<V: VectorFn<T>, T, U, F: Fn(T) -> U> VectorFn<U> for VectorFnMap<V, T, U, F> {
139    fn at(&self, i: usize) -> U { (self.mapping_fn)(self.base.at(i)) }
140
141    fn len(&self) -> usize { self.base.len() }
142}