ndgrid/geometry/
point.rs

1//! Point
2use crate::{traits::Point as PointTrait, types::Scalar};
3
4/// A points
5#[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    /// Create new
13    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/// Iterator over points
34#[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    /// Create new
41    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}