eedb/share/include/tao/json/external/pegtl/contrib/changes.hh
2017-02-26 09:32:45 +01:00

69 lines
2.3 KiB
C++

// Copyright (c) 2015 Dr. Colin Hirsch and Daniel Frey
// Please see LICENSE for license or visit https://github.com/ColinH/PEGTL/
#ifndef TAO_CPP_PEGTL_CONTRIB_CHANGES_HH
#define TAO_CPP_PEGTL_CONTRIB_CHANGES_HH
#include <type_traits>
#include "../normal.hh"
namespace tao_json_pegtl
{
namespace internal
{
struct dummy_disabled_state
{
template< typename ... Ts >
void success( Ts && ... )
{ }
};
template< tao_json_pegtl::apply_mode A, typename State >
using state_disable_helper = typename std::conditional< A == tao_json_pegtl::apply_mode::ACTION, State, dummy_disabled_state >::type;
} // namespace internal
template< typename Rule, typename State, template< typename ... > class Base = tao_json_pegtl::normal >
struct change_state
: public Base< Rule >
{
template< tao_json_pegtl::apply_mode A, template< typename ... > class Action, template< typename ... > class Control, typename Input, typename ... States >
static bool match( Input & in, States && ... st )
{
internal::state_disable_helper< A, State > s;
if ( Base< Rule >::template match< A, Action, Control >( in, s ) ) {
s.success( st ... );
return true;
}
return false;
}
};
template< typename Rule, template< typename ... > class Action, template< typename ... > class Base = tao_json_pegtl::normal >
struct change_action
: public Base< Rule >
{
template< tao_json_pegtl::apply_mode A, template< typename ... > class, template< typename ... > class Control, typename Input, typename ... States >
static bool match( Input & in, States && ... st )
{
return Base< Rule >::template match< A, Action, Control >( in, st ... );
}
};
template< template< typename ... > class Action, template< typename ... > class Base >
struct change_both_helper
{
template< typename T > using change_action = change_action< T, Action, Base >;
};
template< typename Rule, typename State, template< typename ... > class Action, template< typename ... > class Base = tao_json_pegtl::normal >
struct change_state_and_action
: public change_state< Rule, State, change_both_helper< Action, Base >::template change_action >
{ };
} // namespace tao_json_pegtl
#endif