peg_runtime/
slice.rs

1use super::{Parse, ParseElem, ParseLiteral, ParseSlice, RuleResult};
2
3impl<T> Parse for [T] {
4    type PositionRepr = usize;
5    #[inline]
6    fn start(&self) -> usize {
7        0
8    }
9
10    #[inline]
11    fn is_eof(&self, pos: usize) -> bool {
12        pos >= self.len()
13    }
14
15    #[inline]
16    fn position_repr(&self, pos: usize) -> usize {
17        pos
18    }
19}
20
21impl<'input, T: 'input + Copy> ParseElem<'input> for [T] {
22    type Element = T;
23
24    #[inline]
25    fn parse_elem(&'input self, pos: usize) -> RuleResult<T> {
26        match self[pos..].first() {
27            Some(c) => RuleResult::Matched(pos + 1, *c),
28            None => RuleResult::Failed,
29        }
30    }
31}
32
33impl ParseLiteral for [u8] {
34    #[inline]
35    fn parse_string_literal(&self, pos: usize, literal: &str) -> RuleResult<()> {
36        let l = literal.len();
37        if self.len() >= pos + l && &self[pos..pos + l] == literal.as_bytes() {
38            RuleResult::Matched(pos + l, ())
39        } else {
40            RuleResult::Failed
41        }
42    }
43}
44
45impl<'input, T: 'input> ParseSlice<'input> for [T] {
46    type Slice = &'input [T];
47    #[inline]
48    fn parse_slice(&'input self, p1: usize, p2: usize) -> &'input [T] {
49        &self[p1..p2]
50    }
51}