macro_rules! run_iter {
(
input: $input:expr,
parser: $parser:expr,
state: $data_ty:ty : $data:expr,
size_hint($size_hint_self:ident) $size_hint:block
next($next_self:ident) {
pre $pre_next:block
on $on_next:block
}
=> $result:ident : $t:ty {
$($pat:pat => $arm:expr),*$(,)*
}
) => { {
struct Iter<I: Input, T, E, F>
where F: FnMut(I) -> ParseResult<I, T, E> {
state: Option<E>,
parser: F,
buf: Option<I>,
mark: I::Marker,
data: $data_ty,
_t: PhantomData<T>,
}
impl<I: Input, T, E, F> Iter<I, T, E, F>
where F: FnMut(I) -> ParseResult<I, T, E> {
#[inline]
fn end_state(self) -> (I, $data_ty, I::Marker, Option<E>) {
(self.buf.expect("Iter.buf was None"), self.data, self.mark, self.state)
}
}
impl<I: Input, T, E, F> Iterator for Iter<I, T, E, F>
where F: FnMut(I) -> ParseResult<I, T, E> {
type Item = T;
#[inline]
fn size_hint(&$size_hint_self) -> (usize, Option<usize>) {
$size_hint
}
#[inline]
fn next(&mut $next_self) -> Option<Self::Item> {
$pre_next
let i = $next_self.buf.take().expect("Iter.buf was None");
$next_self.mark = i.mark();
match ($next_self.parser)(i).into_inner() {
(b, Ok(v)) => {
$next_self.buf = Some(b);
$on_next
Some(v)
},
(b, Err(e)) => {
$next_self.buf = Some(b);
$next_self.state = Some(e);
None
},
}
}
}
let mark = $input.mark();
let mut iter = Iter {
state: None,
parser: $parser,
buf: Some($input),
mark,
data: $data,
_t: PhantomData,
};
let $result: $t = FromIterator::from_iter(iter.by_ref());
match iter.end_state() {
$($pat => $arm),*
}
} }
}
macro_rules! run_iter_till {
(
input: $input:expr,
parser: $parser:expr,
end: $end:expr,
state: $data_ty:ty : $data:expr,
size_hint($size_hint_self:ident) $size_hint:block
next($next_self:ident) {
pre $pre_next:block
on $on_next:block
}
=> $result:ident : $t:ty {
$($pat:pat => $arm:expr),*$(,)*
}
) => { {
enum EndStateTill<E> {
Error(E),
Incomplete,
EndSuccess,
}
struct IterTill<I: Input, T, U, E, F, P, N>
where E: From<N>,
P: FnMut(I) -> ParseResult<I, T, E>,
F: FnMut(I) -> ParseResult<I, U, N> {
state: EndStateTill<E>,
parser: P,
end: F,
buf: Option<I>,
data: $data_ty,
_t: PhantomData<(T, U, N)>,
}
impl<I: Input, T, U, E, F, P, N> IterTill<I, T, U, E, F, P, N>
where E: From<N>,
P: FnMut(I) -> ParseResult<I, T, E>,
F: FnMut(I) -> ParseResult<I, U, N> {
#[inline]
fn end_state(self) -> (I, $data_ty, EndStateTill<E>) {
(self.buf.expect("Iter.buf was None"), self.data, self.state)
}
}
impl<I: Input, T, U, E, F, P, N> Iterator for IterTill<I, T, U, E, F, P, N>
where E: From<N>,
P: FnMut(I) -> ParseResult<I, T, E>,
F: FnMut(I) -> ParseResult<I, U, N> {
type Item = T;
#[inline]
fn size_hint(&$size_hint_self) -> (usize, Option<usize>) {
$size_hint
}
#[inline]
fn next(&mut $next_self) -> Option<Self::Item> {
$pre_next
let i = $next_self.buf.take().expect("Iter.buf was None");
match ($next_self.parser)(i).into_inner() {
(b, Ok(v)) => {
$next_self.buf = Some(b);
$on_next
Some(v)
},
(b, Err(e)) => {
$next_self.buf = Some(b);
$next_self.state = EndStateTill::Error(e);
None
},
}
}
}
let mut iter = IterTill {
state: EndStateTill::Incomplete,
parser: $parser,
end: $end,
buf: Some($input),
data: $data,
_t: PhantomData,
};
let $result: $t = FromIterator::from_iter(iter.by_ref());
match iter.end_state() {
$($pat => $arm),*
}
} }
}
macro_rules! iter_till_end_test {
($the_self:ident) => {{
let i = $the_self.buf.take().expect("Iter.buf was None");
let m = i.mark();
match ($the_self.end)(i).into_inner() {
(b, Ok(_)) => {
$the_self.buf = Some(b);
$the_self.state = EndStateTill::EndSuccess;
return None;
}
(b, Err(_)) => $the_self.buf = Some(b.restore(m)),
}
}};
}