use core::error::Error;
use core::fmt::{Display, Formatter, Result as FmtResult};
#[cfg(feature = "lender")]
use crate::lender_adapter::PooledLenderAdapter;
#[cfg(feature = "lending-iterator")]
use crate::lending_iterator_adapter::PooledLendingIteratorAdapter;
pub trait PooledIterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
fn try_next(&mut self) -> Result<Option<Self::Item>, OutOfBuffers>;
#[must_use]
fn buffer_pool_size(&self) -> usize;
#[must_use]
fn available_buffers(&self) -> usize;
#[cfg(feature = "lender")]
#[inline]
#[must_use]
fn into_lender(self) -> PooledLenderAdapter<Self> where Self: Sized {
PooledLenderAdapter::new(self)
}
#[cfg(feature = "lending-iterator")]
#[inline]
#[must_use]
fn into_lending_iterator(self) -> PooledLendingIteratorAdapter<Self> where Self: Sized {
PooledLendingIteratorAdapter::new(self)
}
}
#[derive(Debug, Clone, Copy)]
pub struct OutOfBuffers;
impl Display for OutOfBuffers {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
write!(
f,
"a pooled iterator operation was not performed because there were no buffers available",
)
}
}
impl Error for OutOfBuffers {}