1use crate::{traits::Point as PointTrait, types::Scalar};
3
4#[derive(Debug, Clone, Copy)]
6pub struct Point<'a, T: Scalar> {
7 index: usize,
8 coordinates: &'a [T],
9}
10
11impl<'a, T: Scalar> Point<'a, T> {
12 pub fn new(index: usize, coordinates: &'a [T]) -> Self {
14 Self { index, coordinates }
15 }
16}
17impl<T: Scalar> PointTrait for Point<'_, T> {
18 type T = T;
19
20 fn index(&self) -> usize {
21 self.index
22 }
23
24 fn dim(&self) -> usize {
25 self.coordinates.len()
26 }
27
28 fn coords(&self, data: &mut [T]) {
29 data.copy_from_slice(self.coordinates);
30 }
31}
32
33#[derive(Debug)]
35pub struct PointIter<'a, T: Scalar> {
36 points: Vec<(usize, &'a [T])>,
37 index: usize,
38}
39impl<'a, T: Scalar> PointIter<'a, T> {
40 pub fn new(points: Vec<(usize, &'a [T])>) -> Self {
42 Self { points, index: 0 }
43 }
44}
45impl<'a, T: Scalar> Iterator for PointIter<'a, T> {
46 type Item = Point<'a, T>;
47
48 fn next(&mut self) -> Option<Point<'a, T>> {
49 self.index += 1;
50 if self.index <= self.points.len() {
51 Some(Point::new(
52 self.points[self.index - 1].0,
53 self.points[self.index - 1].1,
54 ))
55 } else {
56 None
57 }
58 }
59}