feanor_math/seq/
conversion.rs

1use std::{marker::PhantomData, num::NonZero};
2
3use super::*;
4
5///
6/// Iterator over the elements of a [`VectorFn`].
7/// Produced by the function [`VectorFn::iter()`] and [`VectorFn::into_iter()`].
8/// 
9#[derive(Debug)]
10pub struct VectorFnIter<V: VectorFn<T>, T> {
11    content: V,
12    begin: usize,
13    end: usize,
14    element: PhantomData<T>
15}
16
17impl<V: VectorFn<T>, T> VectorFnIter<V, T> {
18
19    pub fn new(content: V) -> Self {
20        Self {
21            end: content.len(),
22            content: content,
23            begin: 0,
24            element: PhantomData
25        }
26    }
27}
28
29impl<V: Clone + VectorFn<T>, T> Clone for VectorFnIter<V, T> {
30    
31    fn clone(&self) -> Self {
32        Self {
33            begin: self.begin,
34            end: self.end,
35            content: self.content.clone(),
36            element: PhantomData
37        }
38    }
39}
40
41impl<V: Copy + VectorFn<T>, T> Copy for VectorFnIter<V, T> {}
42
43impl<V: VectorFn<T>, T> Iterator for VectorFnIter<V, T> {
44
45    type Item = T;
46
47    fn next(&mut self) -> Option<Self::Item> {
48        if self.begin < self.end {
49            self.begin += 1;
50            return Some(self.content.at(self.begin - 1));
51        } else {
52            return None;
53        }
54    }
55
56    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
57        if self.begin + n <= self.end {
58            self.begin += n;
59            return Ok(());
60        } else {
61            let lacking_elements = n - (self.end - self.begin);
62            self.begin = self.end;
63            return Err(NonZero::new(lacking_elements).unwrap())
64        }
65    }
66}
67
68impl<V: VectorFn<T>, T> DoubleEndedIterator for VectorFnIter<V, T> {
69    fn next_back(&mut self) -> Option<Self::Item> {
70        if self.begin < self.end {
71            self.end -= 1;
72            return Some(self.content.at(self.end));
73        } else {
74            return None;
75        }
76    }
77
78    fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
79        if self.begin + n <= self.end {
80            self.end -= n;
81            return Ok(());
82        } else {
83            let lacking_elements = n - (self.end - self.begin);
84            self.end = self.begin;
85            return Err(NonZero::new(lacking_elements).unwrap())
86        }
87    }
88}
89
90impl<V: VectorFn<T>, T> ExactSizeIterator for VectorFnIter<V, T> {
91    fn len(&self) -> usize {
92        self.end - self.begin
93    }
94}
95
96///
97/// A [`VectorFn`] that produces its elements by cloning the elements of an underlying [`VectorView`].
98/// Produced by the functions [`VectorView::clone_els()`] and [`VectorView::clone_ring_els()`].
99/// 
100#[derive(Debug)]
101pub struct CloneElFn<V: VectorView<T>, T, F: Fn(&T) -> T> {
102    content: V,
103    clone_el: F,
104    element: PhantomData<T>
105}
106
107impl<V: Clone + VectorView<T>, T, F: Clone + Fn(&T) -> T> Clone for CloneElFn<V, T, F> {
108    
109    fn clone(&self) -> Self {
110        Self {
111            clone_el: self.clone_el.clone(),
112            content: self.content.clone(),
113            element: PhantomData
114        }
115    }
116}
117
118impl<V: Copy + VectorView<T>, T, F: Copy + Fn(&T) -> T> Copy for CloneElFn<V, T, F> {}
119
120impl<V: VectorView<T>, T, F: Fn(&T) -> T> CloneElFn<V, T, F> {
121
122    ///
123    /// Creates a new [`CloneElFn`].
124    /// 
125    /// In most circumstances, it is easier to instead use the functions [`VectorView::clone_els()`] 
126    /// and [`VectorView::clone_ring_els()`] to produce a [`CloneElFn`].
127    /// 
128    pub fn new(content: V, clone_el: F) -> Self {
129        Self {
130            content: content,
131            clone_el: clone_el,
132            element: PhantomData
133        }
134    }
135}
136
137impl<V: SelfSubvectorView<T>, T, F: Fn(&T) -> T> SelfSubvectorFn<T> for CloneElFn<V, T, F> {
138
139    fn restrict_full(self, range: Range<usize>) -> Self {
140        Self {
141            content: self.content.restrict_full(range),
142            clone_el: self.clone_el,
143            element: PhantomData
144        }
145    }
146}
147
148impl<V: VectorView<T>, T, F: Fn(&T) -> T> VectorFn<T> for CloneElFn<V, T, F> {
149    
150    fn at(&self, i: usize) -> T {
151        (self.clone_el)(self.content.at(i))
152    }
153
154    fn len(&self) -> usize {
155        self.content.len()
156    }
157}
158
159///
160/// Wrapper around [`VectorView`] that interprets it as a [`VectorFn`]. The elements it provides are
161/// just the same references that would be returned through [`VectorFn::at()`].
162/// Produced by the function [`VectorView::as_fn()`].
163/// 
164#[derive(Debug)]
165pub struct VectorViewFn<'a, V: ?Sized + VectorView<T>, T: ?Sized> {
166    content: &'a V,
167    element: PhantomData<T>
168}
169
170impl<'a, V: ?Sized + VectorView<T>, T: ?Sized> Clone for VectorViewFn<'a, V, T> {
171    
172    fn clone(&self) -> Self {
173        *self
174    }
175}
176
177impl<'a, V: ?Sized + VectorView<T>, T: ?Sized> Copy for VectorViewFn<'a, V, T> {}
178
179impl<'a, V: ?Sized + VectorView<T>, T: ?Sized> VectorViewFn<'a, V, T> {
180
181    ///
182    /// Creates a new [`VectorViewFn`].
183    /// In most circumstances, it is easier to instead use the function [`VectorView::as_fn()`].
184    /// 
185    pub fn new(content: &'a V) -> Self {
186        Self {
187            content: content,
188            element: PhantomData
189        }
190    }
191}
192
193impl<'a, V: ?Sized + VectorView<T>, T: ?Sized> VectorFn<&'a T> for VectorViewFn<'a, V, T> {
194    
195    fn at(&self, i: usize) -> &'a T {
196        self.content.at(i)
197    }
198
199    fn len(&self) -> usize {
200        self.content.len()
201    }
202}