Skip to main content

slk_tokenstream/
bookmark.rs

1use core::marker::PhantomData;
2
3/// A mark struct used to mark positions in a `TokenStream` for backtracking    
4/// 
5/// # Examples
6/// ``` rust
7/// use slk_tokenstream::TokenStream;
8/// use slk_tokenstream::Mark;
9/// 
10/// let tokens = &[1, 2, 3];
11/// let mut token_stream = TokenStream::new(tokens);
12/// let mark: Mark = token_stream.mark();
13/// 
14/// token_stream.advance(5);
15/// assert_eq!(token_stream.peek(), None);
16/// token_stream.reset(&mark);
17/// assert_eq!(token_stream.peek(), Some(&1));
18/// ```
19#[derive(Debug, Copy, Clone)]
20pub struct Mark<'a> {
21    position: usize,
22    _lifetime: PhantomData<&'a ()>,
23}
24
25impl<'a> Mark<'a> {
26    /// Creates a new mark with the position
27    pub(crate) fn new(position: usize) -> Self {
28        Self { position, _lifetime: PhantomData }
29    }
30    /// Returns the position
31    /// 
32    /// # Example
33    /// 
34    /// ```
35    /// use slk_tokenstream::Mark;
36    /// use slk_tokenstream::TokenStream;
37    /// 
38    /// let mut token_stream = TokenStream::new(&[0; 12]);
39    /// token_stream.advance(12);
40    /// 
41    ///
42    /// assert_eq!(token_stream.mark().position(), 12);
43    /// ```
44    pub fn position(&self) -> usize {
45        self.position
46    }
47}