#ifndef BOOST_EXT_SPIRIT_NONSTANDARD_QI_DIRECTIVE_IDENTITY_HPP #define BOOST_EXT_SPIRIT_NONSTANDARD_QI_DIRECTIVE_IDENTITY_HPP #include #include #include #include #include #include namespace boost { namespace spirit { BOOST_SPIRIT_TERMINAL_EX(identity) template <> // enable identity[p] struct use_directive : mpl::true_ {}; namespace qi { template struct identity_parser : unary_parser > { typedef Subject subject_type; template struct attribute { typedef typename traits::attribute_of::type type; }; identity_parser(Subject const& subject) : subject(subject) {} template bool parse(Iterator& first, Iterator const& last , Context& context, Skipper const& skipper , Attribute& attr) const { return subject.parse(first, last, context, skipper, attr); } template info what(Context& context) const { return info("identity", subject.what(context)); } Subject subject; private: // silence MSVC warning C4512: assignment operator could not be generated identity_parser& operator= (identity_parser const&); }; template struct make_directive { typedef identity_parser result_type; template result_type operator()( Terminal const& term, Subject const& subject, unused_type) const { return result_type(subject); } }; } namespace traits { template struct has_semantic_action > : unary_has_semantic_action {}; } }} // boost::spirit #endif//BOOST_EXT_SPIRIT_NONSTANDARD_QI_DIRECTIVE_IDENTITY_HPP