use alloc::vec::Vec;
use geometry_coords::CoordinateScalar;
use geometry_cs::CoordinateSystem;
use geometry_tag::GeometryCollectionTag;
use geometry_trait::{Geometry, GeometryCollection};
use crate::DynGeometry;
#[derive(Debug, Clone, PartialEq, Default)]
pub struct DynGeometryCollection<S: CoordinateScalar, Cs: CoordinateSystem>(
pub Vec<DynGeometry<S, Cs>>,
);
impl<S, Cs> Geometry for DynGeometryCollection<S, Cs>
where
S: CoordinateScalar,
Cs: CoordinateSystem,
{
type Kind = GeometryCollectionTag;
type Point = crate::Point<S, 2, Cs>;
}
impl<S, Cs> GeometryCollection for DynGeometryCollection<S, Cs>
where
S: CoordinateScalar,
Cs: CoordinateSystem,
{
type Item = DynGeometry<S, Cs>;
fn items(&self) -> impl ExactSizeIterator<Item = &Self::Item> {
self.0.iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{DynKind, Point2D, linestring, polygon};
use alloc::vec;
use geometry_cs::Cartesian;
type S = f64;
type Pt = Point2D<S, Cartesian>;
#[test]
fn dyn_collection_iterates_in_order() {
let xs = DynGeometryCollection::<S, Cartesian>(vec![
DynGeometry::Point(Pt::new(0.0, 0.0)),
DynGeometry::LineString(linestring![(0.0, 0.0), (1.0, 1.0)]),
DynGeometry::Polygon(polygon![[(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 0.0)]]),
]);
let kinds: Vec<DynKind> = xs.items().map(DynGeometry::kind).collect();
assert_eq!(
kinds,
vec![DynKind::Point, DynKind::LineString, DynKind::Polygon]
);
}
#[test]
fn empty_collection_is_a_geometry_collection() {
let xs = DynGeometryCollection::<S, Cartesian>(vec![]);
assert_eq!(xs.items().count(), 0);
}
fn accepts_collection<C: GeometryCollection>() {}
#[test]
fn dyn_collection_is_a_geometry_collection() {
accepts_collection::<DynGeometryCollection<S, Cartesian>>();
}
}