[][src]Struct nom_locate::LocatedSpan

pub struct LocatedSpan<T, X = ()> {
    pub extra: X,
    // some fields omitted
}

A LocatedSpan is a set of meta information about the location of a token, including extra information.

The LocatedSpan structure can be used as an input of the nom parsers. It implements all the necessary traits for LocatedSpan<&str,X> and LocatedSpan<&[u8],X>

Fields

extra: X

Extra information that can be embedded by the user. Example: the parsed file name

Implementations

impl<T: AsBytes> LocatedSpan<T, ()>[src]

pub fn new(program: T) -> LocatedSpan<T, ()>[src]

Create a span for a particular input with default offset and line values and empty extra data. You can compute the column through the get_column or get_utf8_column methods.

offset starts at 0, line starts at 1, and column starts at 1.

Do not use this constructor in parser functions; nom and nom_locate assume span offsets are relative to the beginning of the same input. In these cases, you probably want to use the nom::traits::Slice trait instead.

Example of use

use nom_locate::LocatedSpan;

let span = LocatedSpan::new(b"foobar");

assert_eq!(span.location_offset(), 0);
assert_eq!(span.location_line(),   1);
assert_eq!(span.get_column(),      1);
assert_eq!(span.fragment(),        &&b"foobar"[..]);

impl<T: AsBytes, X> LocatedSpan<T, X>[src]

pub fn new_extra(program: T, extra: X) -> LocatedSpan<T, X>[src]

Create a span for a particular input with default offset and line values. You can compute the column through the get_column or get_utf8_column methods.

offset starts at 0, line starts at 1, and column starts at 1.

Do not use this constructor in parser functions; nom and nom_locate assume span offsets are relative to the beginning of the same input. In these cases, you probably want to use the nom::traits::Slice trait instead.

Example of use

use nom_locate::LocatedSpan;

let span = LocatedSpan::new_extra(b"foobar", "extra");

assert_eq!(span.location_offset(), 0);
assert_eq!(span.location_line(),   1);
assert_eq!(span.get_column(),      1);
assert_eq!(span.fragment(),        &&b"foobar"[..]);
assert_eq!(span.extra,             "extra");

pub unsafe fn new_from_raw_offset(
    offset: usize,
    line: u32,
    fragment: T,
    extra: X
) -> LocatedSpan<T, X>
[src]

Similar to new_extra, but allows overriding offset and line. This is unsafe, because giving an offset too large may result in undefined behavior, as some methods move back along the fragment assuming any negative index within the offset is valid.

pub fn location_offset(&self) -> usize[src]

The offset represents the position of the fragment relatively to the input of the parser. It starts at offset 0.

pub fn location_line(&self) -> u32[src]

The line number of the fragment relatively to the input of the parser. It starts at line 1.

pub fn fragment(&self) -> &T[src]

The fragment that is spanned. The fragment represents a part of the input of the parser.

pub fn get_line_beginning(&self) -> &[u8]

Notable traits for &'_ [u8]

impl<'_> Read for &'_ [u8]impl<'_> Write for &'_ mut [u8]
[src]

Return the line that contains this LocatedSpan.

The get_column and get_utf8_column functions returns indexes that corresponds to the line returned by this function.

Note that if this LocatedSpan ends before the end of the original data, the result of calling get_line_beginning() will not include any data from after the LocatedSpan.

let program = LocatedSpan::new(
    "Hello World!\
    \nThis is a multi-line input\
    \nthat ends after this line.\n");
let multi = program.find_substring("multi").unwrap();

assert_eq!(
    program.slice(multi..).get_line_beginning(),
    "This is a multi-line input".as_bytes(),
);

pub fn get_column(&self) -> usize[src]

Return the column index, assuming 1 byte = 1 column.

Use it for ascii text, or use get_utf8_column for UTF8.

Example of use


let span = LocatedSpan::new("foobar");

assert_eq!(span.slice(3..).get_column(), 4);

pub fn get_utf8_column(&self) -> usize[src]

Return the column index for UTF8 text. Return value is unspecified for non-utf8 text.

This version uses bytecount's hyper algorithm to count characters. This is much faster for long lines, but is non-negligibly slower for short slices (below around 100 bytes). This is also sped up significantly more depending on architecture and enabling the simd feature gates. If you expect primarily short lines, you may get a noticeable speedup in parsing by using naive_get_utf8_column instead. Benchmark your specific use case!

Example of use


let span = LocatedSpan::new("メカジキ");
let indexOf3dKanji = span.find_substring("ジ").unwrap();

assert_eq!(span.slice(indexOf3dKanji..).get_column(), 7);
assert_eq!(span.slice(indexOf3dKanji..).get_utf8_column(), 3);

pub fn naive_get_utf8_column(&self) -> usize[src]

Return the column index for UTF8 text. Return value is unspecified for non-utf8 text.

A simpler implementation of get_utf8_column that may be faster on shorter lines. If benchmarking shows that this is faster, you can use it instead of get_utf8_column. Prefer defaulting to get_utf8_column unless this legitimately is a performance bottleneck.

Example of use


let span = LocatedSpan::new("メカジキ");
let indexOf3dKanji = span.find_substring("ジ").unwrap();

assert_eq!(span.slice(indexOf3dKanji..).get_column(), 7);
assert_eq!(span.slice(indexOf3dKanji..).naive_get_utf8_column(), 3);

Trait Implementations

impl<T: AsBytes, X> AsBytes for LocatedSpan<T, X>[src]

impl<T: Clone, X: Clone> Clone for LocatedSpan<T, X>[src]

impl<A: Compare<B>, B: Into<LocatedSpan<B>>, X> Compare<B> for LocatedSpan<A, X>[src]

impl<T: Copy, X: Copy> Copy for LocatedSpan<T, X>[src]

impl<T: Debug, X: Debug> Debug for LocatedSpan<T, X>[src]

impl<T, X> Deref for LocatedSpan<T, X>[src]

type Target = T

The resulting type after dereferencing.

impl<T: ToString, X> Display for LocatedSpan<T, X>[src]

impl<T: AsBytes + Eq, X> Eq for LocatedSpan<T, X>[src]

impl<'a, X> ExtendInto for LocatedSpan<&'a str, X>[src]

type Item = char

The current input type is a sequence of that Item type. Read more

type Extender = String

The type that will be produced

impl<'a, X> ExtendInto for LocatedSpan<&'a [u8], X>[src]

type Item = u8

The current input type is a sequence of that Item type. Read more

type Extender = Vec<u8>

The type that will be produced

impl<'a, T, X> FindSubstring<&'a str> for LocatedSpan<T, X> where
    T: FindSubstring<&'a str>, 
[src]

impl<Fragment: FindToken<Token>, Token, X> FindToken<Token> for LocatedSpan<Fragment, X>[src]

impl<T: AsBytes, X: Default> From<T> for LocatedSpan<T, X>[src]

impl<T: Hash, X> Hash for LocatedSpan<T, X>[src]

impl<'a, X> InputIter for LocatedSpan<&'a str, X>[src]

type Item = char

The current input type is a sequence of that Item type. Read more

type Iter = CharIndices<'a>

An iterator over the input type, producing the item and its position for use with Slice. If we're iterating over &str, the position corresponds to the byte index of the character Read more

type IterElem = Chars<'a>

An iterator over the input type, producing the item

impl<'a, X> InputIter for LocatedSpan<&'a [u8], X>[src]

type Item = u8

The current input type is a sequence of that Item type. Read more

type Iter = Enumerate<Self::IterElem>

An iterator over the input type, producing the item and its position for use with Slice. If we're iterating over &str, the position corresponds to the byte index of the character Read more

type IterElem = Copied<Iter<'a, Self::Item>>

An iterator over the input type, producing the item

impl<T: InputLength, X> InputLength for LocatedSpan<T, X>[src]

impl<T, X> InputTake for LocatedSpan<T, X> where
    Self: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>, 
[src]

impl<T, X> InputTakeAtPosition for LocatedSpan<T, X> where
    T: InputTakeAtPosition + InputLength + InputIter,
    Self: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>> + Clone
[src]

type Item = <T as InputIter>::Item

The current input type is a sequence of that Item type. Read more

impl<T, X> Offset for LocatedSpan<T, X>[src]

impl<R: FromStr, T, X> ParseTo<R> for LocatedSpan<T, X> where
    T: ParseTo<R>, 
[src]

impl<T: AsBytes + PartialEq, X> PartialEq<LocatedSpan<T, X>> for LocatedSpan<T, X>[src]

impl<'a, X: Clone> Slice<Range<usize>> for LocatedSpan<&'a str, X>[src]

impl<'a, X: Clone> Slice<Range<usize>> for LocatedSpan<&'a [u8], X>[src]

impl<'a, X: Clone> Slice<RangeFrom<usize>> for LocatedSpan<&'a str, X>[src]

impl<'a, X: Clone> Slice<RangeFrom<usize>> for LocatedSpan<&'a [u8], X>[src]

impl<'a, X: Clone> Slice<RangeFull> for LocatedSpan<&'a str, X>[src]

impl<'a, X: Clone> Slice<RangeFull> for LocatedSpan<&'a [u8], X>[src]

impl<'a, X: Clone> Slice<RangeTo<usize>> for LocatedSpan<&'a str, X>[src]

impl<'a, X: Clone> Slice<RangeTo<usize>> for LocatedSpan<&'a [u8], X>[src]

Auto Trait Implementations

impl<T, X> RefUnwindSafe for LocatedSpan<T, X> where
    T: RefUnwindSafe,
    X: RefUnwindSafe

impl<T, X> Send for LocatedSpan<T, X> where
    T: Send,
    X: Send

impl<T, X> Sync for LocatedSpan<T, X> where
    T: Sync,
    X: Sync

impl<T, X> Unpin for LocatedSpan<T, X> where
    T: Unpin,
    X: Unpin

impl<T, X> UnwindSafe for LocatedSpan<T, X> where
    T: UnwindSafe,
    X: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Conv for T

impl<T> Conv for T

impl<T> FmtForward for T

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Pipe for T where
    T: ?Sized

impl<T> Pipe for T

impl<T> PipeAsRef for T

impl<T> PipeBorrow for T

impl<T> PipeDeref for T

impl<T> PipeRef for T

impl<T> Tap for T

impl<T> Tap for T

impl<T, U> TapAsRef<U> for T where
    U: ?Sized

impl<T, U> TapBorrow<U> for T where
    U: ?Sized

impl<T> TapDeref for T

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T> TryConv for T

impl<T> TryConv for T

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.