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 {
21 position: usize,
22}
23
24impl Mark {
25 /// Creates a new mark with the position
26 pub(crate) fn new(position: usize) -> Self {
27 Self { position }
28 }
29 /// Returns the position
30 ///
31 /// # Example
32 ///
33 /// ```
34 /// use slk_tokenstream::Mark;
35 /// use slk_tokenstream::TokenStream;
36 ///
37 /// let mut token_stream = TokenStream::new(&[0; 12]);
38 /// token_stream.advance(12);
39 ///
40 ///
41 /// assert_eq!(token_stream.mark().position(), 12);
42 /// ```
43 pub fn position(&self) -> usize {
44 self.position
45 }
46}