use ::generic_arraydeque::{GenericArrayDeque, typenum::U1};
use crate::{
Window,
lexer::{CachedTokenOf, CachedTokenRefOf, MaybeRefCachedTokenOf},
};
use super::{Checkpoint, Lexer, Span};
mod blackhole;
mod generic_arraydeque;
pub type DefaultCache<'a, L> =
::generic_arraydeque::GenericArrayDeque<CachedTokenOf<'a, L>, ::generic_arraydeque::typenum::U3>;
pub trait Cache<'a, L: Lexer<'a>>: 'a {
type Options;
fn new() -> Self
where
Self: Sized;
fn with_options(options: Self::Options) -> Self
where
Self: Sized;
#[cfg_attr(not(tarpaulin), inline(always))]
fn is_empty(&self) -> bool {
self.len() == 0
}
fn len(&self) -> usize;
fn remaining(&self) -> usize;
fn rewind(&mut self, checkpoint: &Checkpoint<'a, '_, L>)
where
Self: Sized;
fn push_back(
&mut self,
tok: CachedTokenOf<'a, L>,
) -> Result<CachedTokenRefOf<'_, 'a, L>, CachedTokenOf<'a, L>>;
#[allow(clippy::type_complexity)]
fn pop_front(&mut self) -> Option<CachedTokenOf<'a, L>>;
#[allow(clippy::type_complexity)]
fn pop_back(&mut self) -> Option<CachedTokenOf<'a, L>>;
fn clear(&mut self);
#[allow(clippy::type_complexity)]
fn pop_front_if<F>(&mut self, predicate: F) -> Option<CachedTokenOf<'a, L>>
where
F: FnOnce(CachedTokenRefOf<'_, 'a, L>) -> bool,
{
if let Some(peeked) = self.first() {
if predicate(peeked) {
return self.pop_front();
}
}
None
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn peek_one<'c>(&self) -> Option<MaybeRefCachedTokenOf<'_, 'a, L>>
where
'a: 'c,
{
let mut buf = GenericArrayDeque::new();
self.peek::<U1>(&mut buf);
buf.pop_front()
}
#[allow(clippy::mut_from_ref)]
fn peek<'p, W>(
&'p self,
buf: &mut GenericArrayDeque<MaybeRefCachedTokenOf<'p, 'a, L>, W::CAPACITY>,
) where
W: Window;
#[cfg_attr(not(tarpaulin), inline(always))]
fn push_many<'p>(
&'p mut self,
toks: impl Iterator<Item = CachedTokenOf<'a, L>> + 'p,
) -> impl Iterator<Item = CachedTokenOf<'a, L>> + 'p {
toks.filter_map(move |tok| self.push_back(tok).err())
}
fn first(&self) -> Option<CachedTokenRefOf<'_, 'a, L>>;
fn last(&self) -> Option<CachedTokenRefOf<'_, 'a, L>>;
#[cfg_attr(not(tarpaulin), inline(always))]
fn span(&self) -> Option<L::Span> {
match (self.first(), self.last()) {
(Some(first), Some(last)) => Some(L::Span::new(
first.token().span_ref().start(),
last.token().span_ref().end(),
)),
_ => None,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn first_span<'s>(&'s self) -> Option<&'s L::Span>
where
'a: 's,
{
self.first().map(move |t| *t.token().span())
}
#[cfg_attr(not(tarpaulin), inline(always))]
fn last_span<'s>(&'s self) -> Option<&'s L::Span>
where
'a: 's,
{
self.last().map(move |t| *t.token().span())
}
}