boost/xpressive/detail/static/transforms/as_marker.hpp
/////////////////////////////////////////////////////////////////////////////// // as_marker.hpp // // Copyright 2007 Eric Niebler. 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_XPRESSIVE_DETAIL_STATIC_TRANSFORMS_AS_MARKER_HPP_EAN_04_01_2007 #define BOOST_XPRESSIVE_DETAIL_STATIC_TRANSFORMS_AS_MARKER_HPP_EAN_04_01_2007 // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include <boost/xpressive/detail/detail_fwd.hpp> #include <boost/xpressive/detail/static/static.hpp> #include <boost/xpressive/proto/proto.hpp> //#include <boost/xpressive/proto/transform/construct.hpp> namespace boost { namespace xpressive { namespace detail { //template<typename Grammar> //struct as_marker // : proto::transform::construct< // proto::transform::identity<Grammar> // , proto::shift_right< // proto::terminal<mark_begin_matcher>::type // , proto::shift_right< // proto::transform::right<proto::_> // , proto::terminal<mark_end_matcher>::type // > // >( // proto::terminal<mark_begin_matcher>::type( // mark_begin_matcher(proto::transform::arg<proto::transform::left<proto::_> > ) // ) // , proto::shift_right< // proto::transform::right<proto::_> // , proto::terminal<mark_end_matcher>::type // >( // proto::transform::right<proto::_> // , proto::terminal<mark_end_matcher>::type( // mark_end_matcher(proto::transform::arg<proto::transform::left<proto::_> > ) // ) // ) // ) // > //{}; /////////////////////////////////////////////////////////////////////////////// // as_marker // Insert mark tags before and after the expression template<typename Grammar> struct as_marker : Grammar { as_marker(); template<typename Expr, typename, typename> struct apply : proto::shift_right< proto::terminal<mark_begin_matcher>::type , typename proto::shift_right< typename proto::result_of::right<Expr>::type , proto::terminal<mark_end_matcher>::type >::type > {}; template<typename Expr, typename State, typename Visitor> static typename apply<Expr, State, Visitor>::type call(Expr const &expr, State const &, Visitor &) { int mark_nbr = get_mark_number(proto::left(expr)); mark_begin_matcher begin(mark_nbr); mark_end_matcher end(mark_nbr); typename apply<Expr, State, Visitor>::type that = {{begin}, {proto::right(expr), {end}}}; return that; } }; }}} #endif