/*============================================================================= 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) =============================================================================*/ #if !defined(SPIRIT_X3_WITH_MAY_02_2014_0749AM) #define SPIRIT_X3_WITH_MAY_02_2014_0749AM #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; with_value_holder(Subject const& subject, T const& val) : base_type(subject) , val(val) {} }; template struct with_value_holder : unary_parser { typedef unary_parser base_type; T val; with_value_holder(Subject const& subject, T const& 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; with_directive(Subject const& subject, T const& val) : base_type(subject, 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_context { typedef context type; }; template struct with_context { typedef context type; }; template struct with_gen { T& val; with_gen(T& val) : val(val) {} template with_directive::value_type, ID, T> operator[](Subject const& subject) const { return { as_parser(subject), val }; } }; template inline with_gen with(T& val) { return { val }; } template inline with_gen with(T const& val) { return { val }; } }}} #endif