use {
crate::{
area::Area, entry::Entry, handle_iter::HandleIter, qtinner::QTInner, traversal::Traversal,
types::StoreType,
},
num::PrimInt,
std::iter::FusedIterator,
};
#[derive(Clone, Debug)]
pub struct Iter<'a, U, V>
where
U: PrimInt + Default,
{
store: &'a StoreType<U, V>,
handle_iter: HandleIter<'a, U>,
}
impl<'a, U, V> Iter<'a, U, V>
where
U: PrimInt + Default,
{
pub(crate) fn new(qt: &'a QTInner<U>, store: &'a StoreType<U, V>) -> Iter<'a, U, V> {
Iter {
store,
handle_iter: HandleIter::new(qt),
}
}
}
impl<'a, U, V> Iterator for Iter<'a, U, V>
where
U: PrimInt + Default,
{
type Item = &'a Entry<U, V>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
match self.handle_iter.next() {
Some(handle) => Some(
self.store
.get(&handle)
.expect("Shouldn't have an handle in the tree which isn't in the store."),
),
None => None,
}
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.store.len()))
}
}
impl<U, V> FusedIterator for Iter<'_, U, V> where U: PrimInt + Default {}
#[derive(Debug)]
pub struct IntoIter<U, V>
where
U: PrimInt + Default,
{
pub(crate) entries: Vec<Entry<U, V>>,
}
impl<U, V> Iterator for IntoIter<U, V>
where
U: PrimInt + Default,
{
type Item = Entry<U, V>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.entries.pop()
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, None)
}
}
impl<U, V> FusedIterator for IntoIter<U, V> where U: PrimInt + Default {}
#[derive(Clone, Debug)]
pub struct Query<'a, U, V>
where
U: PrimInt + Default,
{
query_region: Area<U>,
handle_iter: HandleIter<'a, U>,
store: &'a StoreType<U, V>,
traversal_method: Traversal,
}
impl<'a, U, V> Query<'a, U, V>
where
U: PrimInt + Default,
{
pub(crate) fn new(
query_region: Area<U>,
qt: &'a QTInner<U>,
store: &'a StoreType<U, V>,
traversal_method: Traversal,
) -> Query<'a, U, V>
where
U: PrimInt + Default,
{
let mut handle_iter = HandleIter::new(qt);
handle_iter.query_optimization(query_region, traversal_method);
Query {
query_region,
handle_iter,
store,
traversal_method,
}
}
}
impl<'a, U, V> Iterator for Query<'a, U, V>
where
U: PrimInt + Default,
{
type Item = &'a Entry<U, V>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if let Some(handle) = self.handle_iter.next() {
if let Some(entry) = self.store.get(&handle) {
if self.traversal_method.eval(entry.area(), self.query_region) {
return Some(entry);
}
}
return self.next();
}
None
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, Some(self.store.len()))
}
}
impl<U, V> FusedIterator for Query<'_, U, V> where U: PrimInt + Default {}
#[derive(Clone, Debug)]
pub struct Values<'a, U, V>
where
U: PrimInt + Default,
{
pub(crate) inner: Iter<'a, U, V>,
}
impl<'a, U, V> Iterator for Values<'a, U, V>
where
U: PrimInt + Default,
{
type Item = (&'a V);
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().and_then(|e| Some(e.value_ref()))
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, None)
}
}
impl<U, V> FusedIterator for Values<'_, U, V> where U: PrimInt + Default {}
#[derive(Clone, Debug)]
pub struct Regions<'a, U, V>
where
U: PrimInt + Default,
{
pub(crate) inner: Iter<'a, U, V>,
}
impl<'a, U, V> Iterator for Regions<'a, U, V>
where
U: PrimInt + Default,
{
type Item = Area<U>;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().and_then(|e| Some(e.area()))
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, None)
}
}
impl<U, V> FusedIterator for Regions<'_, U, V> where U: PrimInt + Default {}