use lending_iterator::lending_iterator::Item;
use crate::seekable::delegate_seekable;
use crate::{comparator::Comparator, pooled::PooledIterator, seekable::Seekable};
use crate::cursor::{CursorLendingIterator, CursorPooledIterator};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(docsrs, doc(cfg(feature = "lending-iterator")))]
pub struct LendingIteratorAdapter<I>(I);
impl<I> LendingIteratorAdapter<I> {
#[inline]
#[must_use]
pub(crate) const fn new(iter: I) -> Self {
Self(iter)
}
#[inline]
#[must_use]
pub fn into_inner(self) -> I {
self.0
}
}
impl<I: CursorLendingIterator> LendingIteratorAdapter<I> {
#[inline]
#[must_use]
pub fn valid(&self) -> bool {
self.0.valid()
}
#[inline]
#[must_use]
pub fn current(&self) -> Option<Item<'_, Self>> {
self.0.current()
}
#[inline]
#[must_use]
pub fn prev(&mut self) -> Option<Item<'_, Self>> {
self.0.prev()
}
}
delegate_seekable!(LendingIteratorAdapter.0);
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(docsrs, doc(cfg(feature = "lending-iterator")))]
pub struct PooledLendingIteratorAdapter<I: PooledIterator> {
iter: I,
item: Option<I::Item>,
}
impl<I: PooledIterator> PooledLendingIteratorAdapter<I> {
#[inline]
#[must_use]
pub(crate) const fn new(iter: I) -> Self {
Self {
iter,
item: None,
}
}
#[inline]
#[must_use]
pub fn into_inner(self) -> I {
self.iter
}
}
impl<I: CursorPooledIterator> PooledLendingIteratorAdapter<I> {
#[inline]
#[must_use]
pub fn valid(&self) -> bool {
self.iter.valid()
}
#[inline]
#[must_use]
pub const fn current(&self) -> Option<Item<'_, Self>> {
self.item.as_ref()
}
#[inline]
#[must_use]
pub fn prev(&mut self) -> Option<Item<'_, Self>> {
self.item = None;
self.item = self.iter.prev();
self.item.as_ref()
}
}
delegate_seekable!(PooledLendingIteratorAdapter.iter PooledIterator);
mod lint_and_glob_scope {
use lending_iterator::prelude::*;
use crate::{cursor::CursorLendingIterator, pooled::PooledIterator, LentItem};
use super::{LendingIteratorAdapter, PooledLendingIteratorAdapter};
#[gat]
impl<I: CursorLendingIterator> LendingIterator for LendingIteratorAdapter<I> {
type Item<'next> = LentItem<'next, I>;
#[inline]
fn next(&mut self) -> Option<Item<'_, Self>> {
self.0.next()
}
}
#[gat]
impl<I: PooledIterator> LendingIterator for PooledLendingIteratorAdapter<I> {
type Item<'next> = &'next I::Item;
#[inline]
fn next(&mut self) -> Option<Item<'_, Self>> {
self.item = None;
self.item = self.iter.next();
self.item.as_ref()
}
}
}