use arrow_buffer::OffsetBuffer;
use geo_traits::GeometryCollectionTrait;
use geoarrow_schema::Dimension;
use crate::array::MixedGeometryArray;
use crate::eq::geometry_collection_eq;
use crate::scalar::Geometry;
use crate::util::OffsetBufferUtils;
#[derive(Debug, Clone)]
pub struct GeometryCollection<'a> {
pub(crate) array: &'a MixedGeometryArray,
pub(crate) geom_offsets: &'a OffsetBuffer<i32>,
pub(crate) geom_index: usize,
start_offset: usize,
}
impl<'a> GeometryCollection<'a> {
pub(crate) fn new(
array: &'a MixedGeometryArray,
geom_offsets: &'a OffsetBuffer<i32>,
geom_index: usize,
) -> Self {
let (start_offset, _) = geom_offsets.start_end(geom_index);
Self {
array,
geom_offsets,
geom_index,
start_offset,
}
}
pub(crate) fn native_dim(&self) -> Dimension {
self.array.dim
}
}
impl<'a> GeometryCollectionTrait for GeometryCollection<'a> {
type GeometryType<'b>
= Geometry<'a>
where
Self: 'b;
fn num_geometries(&self) -> usize {
let (start, end) = self.geom_offsets.start_end(self.geom_index);
end - start
}
unsafe fn geometry_unchecked(&self, i: usize) -> Self::GeometryType<'_> {
self.array.value(self.start_offset + i)
}
}
impl<'a> GeometryCollectionTrait for &'a GeometryCollection<'a> {
type GeometryType<'b>
= Geometry<'a>
where
Self: 'b;
fn num_geometries(&self) -> usize {
let (start, end) = self.geom_offsets.start_end(self.geom_index);
end - start
}
unsafe fn geometry_unchecked(&self, i: usize) -> Self::GeometryType<'_> {
self.array.value(self.start_offset + i)
}
}
impl<G: GeometryCollectionTrait<T = f64>> PartialEq<G> for GeometryCollection<'_> {
fn eq(&self, other: &G) -> bool {
geometry_collection_eq(self, other)
}
}