This commit is contained in:
janis 2025-09-29 15:56:05 +02:00
parent 260150de15
commit ae0fb53b90
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -195,6 +195,7 @@ tokens!(pub Token: {
I32 => "i32", I32 => "i32",
I64 => "i64", I64 => "i64",
Const => "const", Const => "const",
Mutable => "mut",
Volatile => "volatile", Volatile => "volatile",
Noalias => "noalias", Noalias => "noalias",
Fn => "fn", Fn => "fn",
@ -211,6 +212,7 @@ tokens!(pub Token: {
Packed => "packed", Packed => "packed",
Extern => "extern", Extern => "extern",
Pub => "pub", Pub => "pub",
Module => "mod",
// Operators // Operators
Dot => ".", Dot => ".",
MinusGreater => "->", MinusGreater => "->",
@ -305,6 +307,7 @@ use std::{
use trie::Tree; use trie::Tree;
#[derive(Debug, Clone)]
pub struct TokenItem<'a> { pub struct TokenItem<'a> {
pub token: Token, pub token: Token,
pub lexeme: &'a str, pub lexeme: &'a str,
@ -584,10 +587,13 @@ where
{ {
iter: &'a mut I, iter: &'a mut I,
cache: Queue<'b, T>, cache: Queue<'b, T>,
cursor: usize, peeking_cursor: usize,
_marker: PhantomData<Marker>, _marker: PhantomData<Marker>,
} }
pub type ReborrowingPeekingIterator<'a, 'b, I, T> = ReborrowingIterator<'a, 'b, I, T, Peeking>;
pub type ReborrowingConsumingIterator<'a, 'b, I, T> = ReborrowingIterator<'a, 'b, I, T, Consuming>;
impl<'a, 'b, I, T, Marker> ReborrowingIterator<'a, 'b, I, T, Marker> impl<'a, 'b, I, T, Marker> ReborrowingIterator<'a, 'b, I, T, Marker>
where where
I: Iterator<Item = T>, I: Iterator<Item = T>,
@ -596,7 +602,7 @@ where
Self { Self {
iter, iter,
cache: Queue::Owned(VecDeque::new()), cache: Queue::Owned(VecDeque::new()),
cursor: 0, peeking_cursor: 0,
_marker: PhantomData, _marker: PhantomData,
} }
} }
@ -605,7 +611,7 @@ where
ReborrowingIterator { ReborrowingIterator {
iter: self.iter, iter: self.iter,
cache: self.cache, cache: self.cache,
cursor: 0, peeking_cursor: 0,
_marker: PhantomData, _marker: PhantomData,
} }
} }
@ -614,7 +620,7 @@ where
ReborrowingIterator { ReborrowingIterator {
iter: self.iter, iter: self.iter,
cache: self.cache, cache: self.cache,
cursor: 0, peeking_cursor: 0,
_marker: PhantomData, _marker: PhantomData,
} }
} }
@ -623,7 +629,7 @@ where
ReborrowingIterator { ReborrowingIterator {
iter: self.iter, iter: self.iter,
cache: self.cache.borrowed(), cache: self.cache.borrowed(),
cursor: 0, peeking_cursor: 0,
_marker: PhantomData, _marker: PhantomData,
} }
} }
@ -632,30 +638,27 @@ where
ReborrowingIterator { ReborrowingIterator {
iter: self.iter, iter: self.iter,
cache: self.cache.borrowed(), cache: self.cache.borrowed(),
cursor: 0, peeking_cursor: 0,
_marker: PhantomData, _marker: PhantomData,
} }
} }
}
pub fn borrow_consuming_at_cursor( impl<'a, 'b, I, T> ReborrowingIterator<'a, 'b, I, T, Consuming>
&'_ mut self, where
) -> ReborrowingIterator<'_, '_, I, T, Consuming> { I: Iterator<Item = T>,
_ = self.cache.drain(0..self.cursor); {
ReborrowingIterator { pub fn expect_one_of<Ts: IntoIterator<Item = T>>(&mut self, candidates: Ts) -> Option<T>
iter: self.iter, where
cache: self.cache.borrowed(), T: Eq,
cursor: 0, {
_marker: PhantomData, let mut candidates = candidates.into_iter();
}
}
pub fn reborrow_consuming_at_cursor(mut self) -> ReborrowingIterator<'a, 'b, I, T, Consuming> { let token = self.next()?;
_ = self.cache.drain(0..self.cursor); if candidates.any(|cand| cand == token) {
ReborrowingIterator { Some(token)
iter: self.iter, } else {
cache: self.cache, None
cursor: 0,
_marker: PhantomData,
} }
} }
} }
@ -671,33 +674,87 @@ where
} }
} }
impl<'a, 'b, I, T> Iterator for ReborrowingIterator<'a, 'b, I, T, Peeking>
where
I: Iterator<Item = T>,
T: Copy,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.peek_next().copied()
}
}
impl<'a, 'b, I, T> ReborrowingIterator<'a, 'b, I, T, Peeking> impl<'a, 'b, I, T> ReborrowingIterator<'a, 'b, I, T, Peeking>
where where
I: Iterator<Item = T>, I: Iterator<Item = T>,
{ {
pub fn peek(&mut self) -> Option<&T> { pub fn peek_next(&mut self) -> Option<&T> {
if self.cursor >= self.cache.len() { if self.peeking_cursor >= self.cache.len() {
if let Some(item) = self.iter.next() { if let Some(item) = self.iter.next() {
self.cursor += 1; self.peeking_cursor += 1;
Some(self.cache.push_back_mut(item)) Some(self.cache.push_back_mut(item))
} else { } else {
None None
} }
} else { } else {
let item = self.cache.get(self.cursor)?; let item = self.cache.get(self.peeking_cursor)?;
self.cursor += 1; self.peeking_cursor += 1;
Some(item) Some(item)
} }
} }
pub fn drain_peeked(&mut self) -> impl Iterator<Item = T> + '_ {
let drained = self.cache.drain(0..self.peeking_cursor);
self.peeking_cursor = 0;
drained
}
pub fn skip(&mut self, n: usize) { pub fn skip(&mut self, n: usize) {
let cached = self.cache.len() - self.cursor; let cached = self.cache.len() - self.peeking_cursor;
self.cursor.saturating_add(n); self.peeking_cursor = self.peeking_cursor.saturating_add(n);
if n > cached { if n > cached {
// need to pull from the underlying iterator // need to pull from the underlying iterator
let surplus = n - cached; let surplus = n - cached;
self.cache.extend(self.iter.take(surplus)); self.cache.extend(self.iter.take(surplus));
self.cursor += n; self.peeking_cursor += n;
}
}
pub fn borrow_consuming_at_cursor(
&'_ mut self,
) -> ReborrowingIterator<'_, '_, I, T, Consuming> {
_ = self.drain_peeked();
ReborrowingIterator {
iter: self.iter,
cache: self.cache.borrowed(),
peeking_cursor: 0,
_marker: PhantomData,
}
}
pub fn reborrow_consuming_at_cursor(mut self) -> ReborrowingIterator<'a, 'b, I, T, Consuming> {
_ = self.drain_peeked();
ReborrowingIterator {
iter: self.iter,
cache: self.cache,
peeking_cursor: 0,
_marker: PhantomData,
}
}
pub fn peek_one_of<Ts: IntoIterator<Item = T>>(&mut self, candidates: Ts) -> Option<&T>
where
T: Eq,
{
let mut candidates = candidates.into_iter();
let token = self.peek_next()?;
if candidates.any(|cand| &cand == token) {
Some(token)
} else {
None
} }
} }
} }