/*============================================================================= Copyright (c) 2014 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef BOOST_SPIRIT_X3_DIRECTIVE_WITH_HPP #define BOOST_SPIRIT_X3_DIRECTIVE_WITH_HPP #include #include namespace boost { namespace spirit { namespace x3 { /////////////////////////////////////////////////////////////////////////// // with directive injects a value into the context prior to parsing. /////////////////////////////////////////////////////////////////////////// template struct with_value_holder : unary_parser { typedef unary_parser base_type; mutable T val; constexpr with_value_holder(Subject const& subject, T&& val) : base_type(subject) , val(std::forward(val)) {} }; template struct with_value_holder : unary_parser { typedef unary_parser base_type; T& val; constexpr with_value_holder(Subject const& subject, T& val) : base_type(subject) , val(val) {} }; template struct with_directive : with_value_holder, T> { typedef with_value_holder, T> base_type; static bool const is_pass_through_unary = true; static bool const handles_container = Subject::handles_container; typedef Subject subject_type; constexpr with_directive(Subject const& subject, T&& val) : base_type(subject, std::forward(val)) {} template bool parse(Iterator& first, Iterator const& last , Context const& context, RContext& rcontext, Attribute& attr) const { return this->subject.parse( first, last , make_context(this->val, context) , rcontext , attr); } }; template struct with_gen { T&& val; template constexpr with_directive::value_type, ID, T> operator[](Subject const& subject) const { return { as_parser(subject), std::forward(val) }; } }; template constexpr with_gen with(T&& val) { return { std::forward(val) }; } }}} #endif