1 // Copyright (c) 2014-2018 Dr. Colin Hirsch and Daniel Frey
2 // Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
3 
4 #ifndef TAO_PEGTL_INTERNAL_MARKER_HPP
5 #define TAO_PEGTL_INTERNAL_MARKER_HPP
6 
7 #include "../config.hpp"
8 #include "../rewind_mode.hpp"
9 
10 namespace tao
11 {
12    namespace TAO_PEGTL_NAMESPACE
13    {
14       namespace internal
15       {
16          template< typename Iterator, rewind_mode M >
17          class marker
18          {
19          public:
20             static constexpr rewind_mode next_rewind_mode = M;
21 
marker(const Iterator &)22             explicit marker( const Iterator& /*unused*/ ) noexcept
23             {
24             }
25 
26             marker( const marker& ) = delete;
27 
marker(marker &&)28             marker( marker&& /*unused*/ ) noexcept
29             {
30             }
31 
32             ~marker() = default;
33 
34             void operator=( const marker& ) = delete;
35             void operator=( marker&& ) = delete;
36 
operator ()(const bool result) const37             bool operator()( const bool result ) const noexcept
38             {
39                return result;
40             }
41          };
42 
43          template< typename Iterator >
44          class marker< Iterator, rewind_mode::REQUIRED >
45          {
46          public:
47             static constexpr rewind_mode next_rewind_mode = rewind_mode::ACTIVE;
48 
marker(Iterator & i)49             explicit marker( Iterator& i ) noexcept
50                : m_saved( i ),
51                  m_input( &i )
52             {
53             }
54 
55             marker( const marker& ) = delete;
56 
marker(marker && i)57             marker( marker&& i ) noexcept
58                : m_saved( i.m_saved ),
59                  m_input( i.m_input )
60             {
61                i.m_input = nullptr;
62             }
63 
~marker()64             ~marker() noexcept
65             {
66                if( m_input != nullptr ) {
67                   ( *m_input ) = m_saved;
68                }
69             }
70 
71             void operator=( const marker& ) = delete;
72             void operator=( marker&& ) = delete;
73 
operator ()(const bool result)74             bool operator()( const bool result ) noexcept
75             {
76                if( result ) {
77                   m_input = nullptr;
78                   return true;
79                }
80                return false;
81             }
82 
iterator() const83             const Iterator& iterator() const noexcept
84             {
85                return m_saved;
86             }
87 
88          private:
89             const Iterator m_saved;
90             Iterator* m_input;
91          };
92 
93       }  // namespace internal
94 
95    }  // namespace TAO_PEGTL_NAMESPACE
96 
97 }  // namespace tao
98 
99 #endif
100