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}