1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
// Copyright (c) 2020 Dr. Colin Hirsch and Daniel Frey
// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
#ifndef TAO_JSON_PEGTL_CONTRIB_STATE_CONTROL_HPP
#define TAO_JSON_PEGTL_CONTRIB_STATE_CONTROL_HPP
#include <type_traits>
#include "shuffle_states.hpp"
#include "../config.hpp"
#include "../internal/has_unwind.hpp"
namespace TAO_JSON_PEGTL_NAMESPACE
{
template< template< typename... > class Control >
struct state_control
{
template< typename Rule >
struct control
: Control< Rule >
{
static constexpr bool enable = true;
template< typename ParseInput, typename State, typename... States >
static void start( [[maybe_unused]] const ParseInput& in, [[maybe_unused]] State& state, [[maybe_unused]] States&&... st )
{
if constexpr( Control< Rule >::enable ) {
Control< Rule >::start( in, st... );
}
if constexpr( State::template enable< Rule > ) {
state.template start< Rule >( in, st... );
}
#if defined( _MSC_VER )
( (void)st, ... );
#endif
}
template< typename ParseInput, typename State, typename... States >
static void success( [[maybe_unused]] const ParseInput& in, [[maybe_unused]] State& state, [[maybe_unused]] States&&... st )
{
if constexpr( State::template enable< Rule > ) {
state.template success< Rule >( in, st... );
}
if constexpr( Control< Rule >::enable ) {
Control< Rule >::success( in, st... );
}
#if defined( _MSC_VER )
( (void)st, ... );
#endif
}
template< typename ParseInput, typename State, typename... States >
static void failure( [[maybe_unused]] const ParseInput& in, [[maybe_unused]] State& state, [[maybe_unused]] States&&... st )
{
if constexpr( State::template enable< Rule > ) {
state.template failure< Rule >( in, st... );
}
if constexpr( Control< Rule >::enable ) {
Control< Rule >::failure( in, st... );
}
#if defined( _MSC_VER )
( (void)st, ... );
#endif
}
template< typename ParseInput, typename State, typename... States >
[[noreturn]] static void raise( const ParseInput& in, [[maybe_unused]] State& state, States&&... st )
{
if constexpr( State::template enable< Rule > ) {
state.template raise< Rule >( in, st... );
}
Control< Rule >::raise( in, st... );
}
template< typename ParseInput, typename State, typename... States >
static auto unwind( [[maybe_unused]] const ParseInput& in, [[maybe_unused]] State& state, [[maybe_unused]] States&&... st )
-> std::enable_if_t< State::template enable< Rule > || ( Control< Rule >::enable && internal::has_unwind< Control< Rule >, void, const ParseInput&, States... > ) >
{
if constexpr( State::template enable< Rule > ) {
state.template unwind< Rule >( in, st... );
}
if constexpr( Control< Rule >::enable && internal::has_unwind< Control< Rule >, void, const ParseInput&, States... > ) {
Control< Rule >::unwind( in, st... );
}
#if defined( _MSC_VER )
( (void)st, ... );
#endif
}
template< template< typename... > class Action, typename Iterator, typename ParseInput, typename State, typename... States >
static auto apply( const Iterator& begin, const ParseInput& in, [[maybe_unused]] State& state, States&&... st )
-> decltype( Control< Rule >::template apply< Action >( begin, in, st... ) )
{
if constexpr( State::template enable< Rule > ) {
state.template apply< Rule >( in, st... );
}
return Control< Rule >::template apply< Action >( begin, in, st... );
}
template< template< typename... > class Action, typename ParseInput, typename State, typename... States >
static auto apply0( const ParseInput& in, [[maybe_unused]] State& state, States&&... st )
-> decltype( Control< Rule >::template apply0< Action >( in, st... ) )
{
if constexpr( State::template enable< Rule > ) {
state.template apply0< Rule >( in, st... );
}
return Control< Rule >::template apply0< Action >( in, st... );
}
};
template< typename Rule >
using type = rotate_states_right< control< Rule > >;
};
} // namespace TAO_JSON_PEGTL_NAMESPACE
#endif
|