/////////////////////////////////////////////////////////////////////////////// /// \file arg.hpp /// Proto transforms for extracting arguments from expressions. // // 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_PROTO_TRANSFORM_ARG_HPP_EAN_12_16_2006 #define BOOST_PROTO_TRANSFORM_ARG_HPP_EAN_12_16_2006 #include #include #include #include namespace boost { namespace proto { namespace transform { // A transform that simply extracts the arg from an expression template struct arg : Grammar { arg() {} template struct apply : proto::result_of::arg::type, N> {}; template static typename apply::type //reference call(Expr const &expr, State const &state, Visitor &visitor) { // NOTE Grammar::call could return a temporary! // Don't return a dangling reference return proto::arg(Grammar::call(expr, state, visitor)); } }; // A transform that simply extracts the arg from an expression template struct arg_c : Grammar { arg_c() {} template struct apply : proto::result_of::arg_c::type, N> {}; template static typename apply::type //const & call(Expr const &expr, State const &state, Visitor &visitor) { return proto::arg_c(Grammar::call(expr, state, visitor)); } }; // A transform that simply extracts the left arg from an expression template struct left : Grammar { left() {} template struct apply : proto::result_of::left::type> {}; template static typename apply::type //const & call(Expr const &expr, State const &state, Visitor &visitor) { return proto::left(Grammar::call(expr, state, visitor)); } }; // A transform that simply extracts the right arg from an expression template struct right : Grammar { right() {} template struct apply : proto::result_of::right::type> {}; template static typename apply::type //const & call(Expr const &expr, State const &state, Visitor &visitor) { return proto::right(Grammar::call(expr, state, visitor)); } }; // Just return the passed in Expr template struct identity : Grammar { identity() {} BOOST_PROTO_IDENTITY_TRANSFORM(); }; // Just return the state template struct state : Grammar { state() {} template struct apply { typedef State type; }; template static State const & call(Expr const &, State const &state_, Visitor &) { return state_; } }; // Just return the visitor template struct visitor : Grammar { visitor() {} template struct apply { typedef Visitor type; }; template static Visitor & call(Expr const &, State const &, Visitor &visitor_) { return visitor_; } }; }}} namespace boost { namespace proto { template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; template struct is_transform > : mpl::true_ {}; }} #endif