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