/////////////////////////////////////////////////////////////////////////////// /// \file impl.hpp /// Contains definition of transform<> and transform_impl<> helpers. // // Copyright 2008 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_IMPL_HPP_EAN_04_03_2008 #define BOOST_PROTO_TRANSFORM_IMPL_HPP_EAN_04_03_2008 #include #include #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma warning(push) # pragma warning(disable : 4714) // function 'xxx' marked as __forceinline not inlined #endif namespace boost { namespace proto { #ifdef BOOST_NO_RVALUE_REFERENCES /// INTERNAL ONLY /// #define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \ BOOST_PROTO_CALLABLE() \ typedef X proto_is_transform_; \ typedef PrimitiveTransform transform_type; \ \ template \ struct result \ { \ typedef typename boost::proto::detail::apply_transform::result_type type; \ }; \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &e) const \ { \ int i = 0; \ return boost::proto::detail::apply_transform()(e, i, i); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &e, State &s) const \ { \ int i = 0; \ return boost::proto::detail::apply_transform()(e, s, i); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &e, State const &s) const \ { \ int i = 0; \ return boost::proto::detail::apply_transform()(e, s, i); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &e, State &s, Data &d) const \ { \ return boost::proto::detail::apply_transform()(e, s, d); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &e, State const &s, Data &d) const \ { \ return boost::proto::detail::apply_transform()(e, s, d); \ } \ /**/ #else /// INTERNAL ONLY /// #define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \ BOOST_PROTO_CALLABLE() \ typedef X proto_is_transform_; \ typedef PrimitiveTransform transform_type; \ \ template \ struct result \ { \ typedef typename boost::proto::detail::apply_transform::result_type type; \ }; \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &&e) const \ { \ int i = 0; \ return boost::proto::detail::apply_transform()(e, i, i); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &&e, State &&s) const \ { \ int i = 0; \ return boost::proto::detail::apply_transform()(e, s, i); \ } \ \ template \ BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform::result_type \ operator ()(Expr &&e, State &&s, Data &&d) const \ { \ return boost::proto::detail::apply_transform()(e, s, d); \ } \ /**/ #endif #define BOOST_PROTO_TRANSFORM(PrimitiveTransform) \ BOOST_PROTO_TRANSFORM_(PrimitiveTransform, void) \ /**/ namespace detail { template struct apply_transform; template struct apply_transform : PrimitiveTransform::template impl {}; template struct apply_transform : PrimitiveTransform::template impl {}; template struct apply_transform : PrimitiveTransform::template impl {}; } template struct transform { BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) }; template struct transform_impl { typedef Expr const expr; typedef Expr const &expr_param; typedef State const state; typedef State const &state_param; typedef Data const data; typedef Data const &data_param; }; template struct transform_impl { typedef Expr expr; typedef Expr &expr_param; typedef State const state; typedef State const &state_param; typedef Data const data; typedef Data const &data_param; }; template struct transform_impl { typedef Expr const expr; typedef Expr const &expr_param; typedef State state; typedef State &state_param; typedef Data const data; typedef Data const &data_param; }; template struct transform_impl { typedef Expr const expr; typedef Expr const &expr_param; typedef State const state; typedef State const &state_param; typedef Data data; typedef Data &data_param; }; template struct transform_impl { typedef Expr expr; typedef Expr &expr_param; typedef State state; typedef State &state_param; typedef Data const data; typedef Data const &data_param; }; template struct transform_impl { typedef Expr expr; typedef Expr &expr_param; typedef State const state; typedef State const &state_param; typedef Data data; typedef Data &data_param; }; template struct transform_impl { typedef Expr const expr; typedef Expr const &expr_param; typedef State state; typedef State &state_param; typedef Data data; typedef Data &data_param; }; template struct transform_impl { typedef Expr expr; typedef Expr &expr_param; typedef State state; typedef State &state_param; typedef Data data; typedef Data &data_param; }; }} // namespace boost::proto #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma warning(pop) #endif #endif