pub struct DefaultMouth<ET>where
ET: EngineTypes,{
inputs: Vec<TokenSource<<ET as EngineTypes>::Token, <ET as EngineTypes>::File>>,
args: Option<[Vec<<ET as EngineTypes>::Token>; 9]>,
start_ref: Vec<SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>>,
vecs: Vec<Vec<<ET as EngineTypes>::Token>>,
}
Expand description
The default implementation of Mouth
. Well optimized to be fast, but at the cost of not keeping track
of “the depth of current macro expansions” - I found that to be an acceptable loss, since afaict, the only thing that
is done with that information
is to print a corresponding number of .
s if \tracingcommands
is set. By omitting that and just concatenating
all expansions into a single Vec from which to pop()
, we gain a massive speedup.
§Errors
Fields§
§inputs: Vec<TokenSource<<ET as EngineTypes>::Token, <ET as EngineTypes>::File>>
§args: Option<[Vec<<ET as EngineTypes>::Token>; 9]>
§start_ref: Vec<SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>>
§vecs: Vec<Vec<<ET as EngineTypes>::Token>>
Implementations§
Source§impl<ET> DefaultMouth<ET>where
ET: EngineTypes,
impl<ET> DefaultMouth<ET>where
ET: EngineTypes,
Sourcepub fn into<ET2>(self) -> DefaultMouth<ET2>
pub fn into<ET2>(self) -> DefaultMouth<ET2>
Trivial conversion between different compatible EngineTypes
.
Sourcepub fn into_tokens<ET2, F>(self, token: F) -> DefaultMouth<ET2>where
ET2: EngineTypes<Char = <ET as EngineTypes>::Char, File = <ET as EngineTypes>::File>,
F: FnMut(<ET as EngineTypes>::Token) -> <ET2 as EngineTypes>::Token,
pub fn into_tokens<ET2, F>(self, token: F) -> DefaultMouth<ET2>where
ET2: EngineTypes<Char = <ET as EngineTypes>::Char, File = <ET as EngineTypes>::File>,
F: FnMut(<ET as EngineTypes>::Token) -> <ET2 as EngineTypes>::Token,
Less trivial conversion between different EngineTypes
with compatible Token
s.
Trait Implementations§
Source§impl<ET> Mouth<ET> for DefaultMouth<ET>where
ET: EngineTypes,
impl<ET> Mouth<ET> for DefaultMouth<ET>where
ET: EngineTypes,
Source§fn new(
_aux: &mut EngineAux<ET>,
_state: &mut <ET as EngineTypes>::State,
) -> DefaultMouth<ET>
fn new( _aux: &mut EngineAux<ET>, _state: &mut <ET as EngineTypes>::State, ) -> DefaultMouth<ET>
fn file_trace( &self, ) -> impl Iterator<Item = SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>>
Source§fn current_sourceref(
&self,
) -> SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>
fn current_sourceref( &self, ) -> SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>
Get the current
SourceReference
of the Mouth
(file/line/column).Source§fn start_ref(
&self,
) -> SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>
fn start_ref( &self, ) -> SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>
The mouth (can) track(s) two
SourceReference
s: the current one (see current_sourceref
)
and the position
of the last Token
encountered in the top-loop of an engine run that was not the result of an expansion.
The latter is returned by this function. The intuition being that this one indicates the start of the macro
responsible for what is currently happening, even if the Mouth is already further along because more Token
s
have been eaten as arguments to a macro etc.Source§fn update_start_ref(&mut self)
fn update_start_ref(&mut self)
Tells the mouth to update the start reference to the current
SourceReference
(see start_ref
).Source§fn get_args(&mut self) -> [Vec<<ET as EngineTypes>::Token>; 9]
fn get_args(&mut self) -> [Vec<<ET as EngineTypes>::Token>; 9]
We (can) reuse an array of Token vectors for macro arguments and reuse it to avoid frequent memory allocations.
This method provides such an array. If it is not pushed to the mouth using
push_macro_exp
,
later, it should be given back to the mouth using return_args
later.Source§fn return_args(&mut self, exp: [Vec<<ET as EngineTypes>::Token>; 9])
fn return_args(&mut self, exp: [Vec<<ET as EngineTypes>::Token>; 9])
Return the array of Token vectors to the mouth. Should only be called with an array that was previously obtained
using
get_args
.Source§fn endinput(
&mut self,
aux: &mut EngineAux<ET>,
state: &<ET as EngineTypes>::State,
) -> Result<(), InvalidCharacter<<ET as EngineTypes>::Char>>
fn endinput( &mut self, aux: &mut EngineAux<ET>, state: &<ET as EngineTypes>::State, ) -> Result<(), InvalidCharacter<<ET as EngineTypes>::Char>>
Source§fn line_number(&self) -> usize
fn line_number(&self) -> usize
The current line number in the top-most file in the
Mouth
.Source§fn push_macro_exp(&mut self, exp: MacroExpansion<<ET as EngineTypes>::Token>)
fn push_macro_exp(&mut self, exp: MacroExpansion<<ET as EngineTypes>::Token>)
Push a
MacroExpansion
(with arguments already read) to the Mouth
. The Mouth
will return the Token
s lazily,
resolving the parameter tokens in the expansion in the process.Source§fn push_slice_rev(&mut self, exp: &[<ET as EngineTypes>::Token])
fn push_slice_rev(&mut self, exp: &[<ET as EngineTypes>::Token])
Source§fn push_string(&mut self, s: StringLineSource<<ET as EngineTypes>::Char>)
fn push_string(&mut self, s: StringLineSource<<ET as EngineTypes>::Char>)
Source§fn requeue(&mut self, t: <ET as EngineTypes>::Token)
fn requeue(&mut self, t: <ET as EngineTypes>::Token)
Push a
Token
back to the Mouth
. This is useful for e.g. \futurelet
, \expandafter
, or when
reading keywords, numbers, dimensions, etc. that often read “too far ahead” and need to back up.
This method should not be called directly, but rather through EngineReferences::requeue
or Gullet::requeue
.Source§fn push_file(&mut self, f: <ET as EngineTypes>::File)
fn push_file(&mut self, f: <ET as EngineTypes>::File)
Source§fn get_next(
&mut self,
aux: &mut EngineAux<ET>,
state: &<ET as EngineTypes>::State,
) -> Result<Option<<ET as EngineTypes>::Token>, InvalidCharacter<<ET as EngineTypes>::Char>>
fn get_next( &mut self, aux: &mut EngineAux<ET>, state: &<ET as EngineTypes>::State, ) -> Result<Option<<ET as EngineTypes>::Token>, InvalidCharacter<<ET as EngineTypes>::Char>>
Get the next
Token
from the Mouth
.
This method should not be called directly, but rather through EngineReferences::get_next
or Gullet::get_next_opt
. Read moreSource§fn iterate<R, E, F>(
&mut self,
aux: &mut EngineAux<ET>,
state: &<ET as EngineTypes>::State,
cont: F,
eof: E,
) -> Result<R, TeXError<ET>>where
F: FnMut(&mut EngineAux<ET>, <ET as EngineTypes>::Token) -> Result<Option<R>, TeXError<ET>>,
E: Fn(&EngineAux<ET>, &<ET as EngineTypes>::State, &mut DefaultMouth<ET>) -> Result<(), TeXError<ET>>,
fn iterate<R, E, F>(
&mut self,
aux: &mut EngineAux<ET>,
state: &<ET as EngineTypes>::State,
cont: F,
eof: E,
) -> Result<R, TeXError<ET>>where
F: FnMut(&mut EngineAux<ET>, <ET as EngineTypes>::Token) -> Result<Option<R>, TeXError<ET>>,
E: Fn(&EngineAux<ET>, &<ET as EngineTypes>::State, &mut DefaultMouth<ET>) -> Result<(), TeXError<ET>>,
Iterate over the
Token
s in the Mouth
until cont
returns false
. Can be faster than repeatedly calling
get_next_opt
, but
blocking both state changes and expanding macros. Useful for e.g. reading macro arguments or the expansion list
in \def
.
This method should not be called directly, but rather through EngineReferences::iterate
or Gullet::iterate
. Read moreSource§fn preview(
&self,
int: &<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Handler,
cc: &<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>,
esc: Option<<ET as EngineTypes>::Char>,
) -> String
fn preview( &self, int: &<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Handler, cc: &<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>, esc: Option<<ET as EngineTypes>::Char>, ) -> String
For debugging purposes, this method returns a string representation of the upcoming stuff in the
Mouth
.Source§fn read_until_endgroup<E, F>(
&mut self,
aux: &mut EngineAux<ET>,
state: &<ET as EngineTypes>::State,
cont: F,
eof: E,
) -> Result<<ET as EngineTypes>::Token, TeXError<ET>>
fn read_until_endgroup<E, F>( &mut self, aux: &mut EngineAux<ET>, state: &<ET as EngineTypes>::State, cont: F, eof: E, ) -> Result<<ET as EngineTypes>::Token, TeXError<ET>>
Convenience method reading
Token
s in the Mouth
until the next EndGroup
Token
is encountered and returns that. Useful whenever a group is to be taken; e.g. when reading macro arguments.
This method should not be called directly, but rather through EngineReferences::read_until_endgroup
or Gullet::read_until_endgroup
. Read moreAuto Trait Implementations§
impl<ET> Freeze for DefaultMouth<ET>
impl<ET> RefUnwindSafe for DefaultMouth<ET>where
<<ET as EngineTypes>::File as File>::SourceRefID: RefUnwindSafe,
<<ET as EngineTypes>::File as File>::LineSource: RefUnwindSafe,
<ET as EngineTypes>::Token: RefUnwindSafe,
<ET as EngineTypes>::Char: RefUnwindSafe,
impl<ET> Send for DefaultMouth<ET>where
<<ET as EngineTypes>::File as File>::SourceRefID: Send,
<<ET as EngineTypes>::File as File>::LineSource: Send,
<ET as EngineTypes>::Char: Send,
impl<ET> Sync for DefaultMouth<ET>where
<<ET as EngineTypes>::File as File>::SourceRefID: Sync,
<<ET as EngineTypes>::File as File>::LineSource: Sync,
<ET as EngineTypes>::Char: Sync,
impl<ET> Unpin for DefaultMouth<ET>where
<<ET as EngineTypes>::File as File>::SourceRefID: Unpin,
<<ET as EngineTypes>::File as File>::LineSource: Unpin,
<ET as EngineTypes>::Token: Unpin,
<ET as EngineTypes>::Char: Unpin,
impl<ET> UnwindSafe for DefaultMouth<ET>where
<<ET as EngineTypes>::File as File>::SourceRefID: UnwindSafe,
<<ET as EngineTypes>::File as File>::LineSource: UnwindSafe,
<ET as EngineTypes>::Token: UnwindSafe,
<ET as EngineTypes>::Char: UnwindSafe + RefUnwindSafe,
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
The archived version of the pointer metadata for this type.
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Converts some archived metadata to the pointer metadata for itself.
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
§fn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
Deserializes using the given deserializer
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Converts
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Converts
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Converts
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Converts
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more