Struct DefaultMouth

Source
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,

Source

pub fn into<ET2>(self) -> DefaultMouth<ET2>
where ET2: EngineTypes<Token = <ET as EngineTypes>::Token, File = <ET as EngineTypes>::File>,

Trivial conversion between different compatible EngineTypes.

Source

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 Tokens.

Trait Implementations§

Source§

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>

Create a new Mouth. May use EngineAux and State, although in practice, the default implementation doesn’t.
Source§

fn finish(&mut self)

clears the mouth at the end of a run, if desired.
Source§

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>

Get the current SourceReference of the Mouth (file/line/column).
Source§

fn start_ref( &self, ) -> SourceReference<<<ET as EngineTypes>::File as File>::SourceRefID>

The mouth (can) track(s) two SourceReferences: 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 Tokens have been eaten as arguments to a macro etc.
Source§

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]

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])

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>>

\endinput - removes the last file from the Mouth without inserting \everyeof or an EOF Token. Read more
Source§

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>)

Push a MacroExpansion (with arguments already read) to the Mouth. The Mouth will return the Tokens lazily, resolving the parameter tokens in the expansion in the process.
Source§

fn push_exp(&mut self, exp: &TokenList<<ET as EngineTypes>::Token>)

Push a TokenList to the Mouth - e.g. from a token register or \everypar.
Source§

fn push_vec(&mut self, exp: Vec<<ET as EngineTypes>::Token>)

Push a Vec of Tokens to the Mouth. This is occasionally useful for things like \write.
Source§

fn push_slice_rev(&mut self, exp: &[<ET as EngineTypes>::Token])

Push a slice of Tokens to the Mouth, assumed to be in reverse order (i.e. the first token to return is the last one in the slice).
Source§

fn push_string(&mut self, s: StringLineSource<<ET as EngineTypes>::Char>)

Push a string to the Mouth. The Mouth will tokenize the string and return the Tokens lazily.
Source§

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)

Push a file to the Mouth. The Mouth will tokenize the file contents and return the Tokens lazily.
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>>

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 more
Source§

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 Tokens 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 more
Source§

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>>
where F: FnMut(&mut EngineAux<ET>, <ET as EngineTypes>::Token) -> Result<(), TeXError<ET>>, E: Fn(&EngineAux<ET>, &<ET as EngineTypes>::State, &mut Self) -> Result<(), TeXError<ET>>,

Convenience method reading Tokens 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 more

Auto Trait Implementations§

§

impl<ET> Freeze for DefaultMouth<ET>

§

impl<ET> RefUnwindSafe for DefaultMouth<ET>

§

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>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

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
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
§

impl<T> Downcast for T
where T: 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>

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)

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)

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
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<ET, Err, A> IntoErr<ET, Err> for A
where ET: EngineTypes, Err: From<A>,

Source§

fn into_err( self, _aux: &EngineAux<ET>, _state: &<ET as EngineTypes>::State, ) -> Err

§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Metadata = ()

The type for metadata in pointers and references to Self.
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> Fruit for T
where T: Send + Downcast,