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}