use crate::{CoordNum, Geometry};
use std::iter::FromIterator;
use std::ops::{Index, IndexMut};
#[derive(Eq, PartialEq, Clone, Debug, Hash)]
pub struct GeometryCollection<T>(pub Vec<Geometry<T>>)
where
T: CoordNum;
impl<T: CoordNum> Default for GeometryCollection<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: CoordNum> GeometryCollection<T> {
pub fn new() -> GeometryCollection<T> {
GeometryCollection(Vec::new())
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
impl<T: CoordNum, IG: Into<Geometry<T>>> From<IG> for GeometryCollection<T> {
fn from(x: IG) -> Self {
GeometryCollection(vec![x.into()])
}
}
impl<T: CoordNum, IG: Into<Geometry<T>>> FromIterator<IG> for GeometryCollection<T> {
fn from_iter<I: IntoIterator<Item = IG>>(iter: I) -> Self {
GeometryCollection(iter.into_iter().map(|g| g.into()).collect())
}
}
impl<T: CoordNum> Index<usize> for GeometryCollection<T> {
type Output = Geometry<T>;
fn index(&self, index: usize) -> &Geometry<T> {
self.0.index(index)
}
}
impl<T: CoordNum> IndexMut<usize> for GeometryCollection<T> {
fn index_mut(&mut self, index: usize) -> &mut Geometry<T> {
self.0.index_mut(index)
}
}
#[derive(Debug)]
pub struct IntoIteratorHelper<T: CoordNum> {
iter: ::std::vec::IntoIter<Geometry<T>>,
}
impl<T: CoordNum> IntoIterator for GeometryCollection<T> {
type Item = Geometry<T>;
type IntoIter = IntoIteratorHelper<T>;
fn into_iter(self) -> Self::IntoIter {
IntoIteratorHelper {
iter: self.0.into_iter(),
}
}
}
impl<T: CoordNum> Iterator for IntoIteratorHelper<T> {
type Item = Geometry<T>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
#[derive(Debug)]
pub struct IterHelper<'a, T: CoordNum> {
iter: ::std::slice::Iter<'a, Geometry<T>>,
}
impl<'a, T: CoordNum> IntoIterator for &'a GeometryCollection<T> {
type Item = &'a Geometry<T>;
type IntoIter = IterHelper<'a, T>;
fn into_iter(self) -> Self::IntoIter {
IterHelper {
iter: self.0.iter(),
}
}
}
impl<'a, T: CoordNum> Iterator for IterHelper<'a, T> {
type Item = &'a Geometry<T>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
#[derive(Debug)]
pub struct IterMutHelper<'a, T: CoordNum> {
iter: ::std::slice::IterMut<'a, Geometry<T>>,
}
impl<'a, T: CoordNum> IntoIterator for &'a mut GeometryCollection<T> {
type Item = &'a mut Geometry<T>;
type IntoIter = IterMutHelper<'a, T>;
fn into_iter(self) -> Self::IntoIter {
IterMutHelper {
iter: self.0.iter_mut(),
}
}
}
impl<'a, T: CoordNum> Iterator for IterMutHelper<'a, T> {
type Item = &'a mut Geometry<T>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
impl<'a, T: CoordNum> GeometryCollection<T> {
pub fn iter(&'a self) -> IterHelper<'a, T> {
self.into_iter()
}
pub fn iter_mut(&'a mut self) -> IterMutHelper<'a, T> {
self.into_iter()
}
}