use arrow_buffer::OffsetBuffer;
use geo_traits::MultiPointTrait;
use geoarrow_schema::Dimension;
use crate::array::CoordBuffer;
use crate::eq::multi_point_eq;
use crate::scalar::Point;
use crate::util::OffsetBufferUtils;
#[derive(Debug, Clone)]
pub struct MultiPoint<'a> {
pub(crate) coords: &'a CoordBuffer,
pub(crate) geom_offsets: &'a OffsetBuffer<i32>,
pub(crate) geom_index: usize,
start_offset: usize,
}
impl<'a> MultiPoint<'a> {
pub(crate) fn new(
coords: &'a CoordBuffer,
geom_offsets: &'a OffsetBuffer<i32>,
geom_index: usize,
) -> Self {
let (start_offset, _) = geom_offsets.start_end(geom_index);
Self {
coords,
geom_offsets,
geom_index,
start_offset,
}
}
pub(crate) fn native_dim(&self) -> Dimension {
self.coords.dim()
}
}
impl<'a> MultiPointTrait for MultiPoint<'a> {
type InnerPointType<'b>
= Point<'a>
where
Self: 'b;
fn num_points(&self) -> usize {
let (start, end) = self.geom_offsets.start_end(self.geom_index);
end - start
}
unsafe fn point_unchecked(&self, i: usize) -> Self::InnerPointType<'_> {
Point::new(self.coords, self.start_offset + i)
}
}
impl<'a> MultiPointTrait for &'a MultiPoint<'a> {
type InnerPointType<'b>
= Point<'a>
where
Self: 'b;
fn num_points(&self) -> usize {
let (start, end) = self.geom_offsets.start_end(self.geom_index);
end - start
}
unsafe fn point_unchecked(&self, i: usize) -> Self::InnerPointType<'_> {
Point::new(self.coords, self.start_offset + i)
}
}
impl<G: MultiPointTrait<T = f64>> PartialEq<G> for MultiPoint<'_> {
fn eq(&self, other: &G) -> bool {
multi_point_eq(self, other)
}
}