diff options
Diffstat (limited to 'boost/proto/transform/impl.hpp')
-rw-r--r-- | boost/proto/transform/impl.hpp | 132 |
1 files changed, 117 insertions, 15 deletions
diff --git a/boost/proto/transform/impl.hpp b/boost/proto/transform/impl.hpp index 80e9a624f0..5490086bd9 100644 --- a/boost/proto/transform/impl.hpp +++ b/boost/proto/transform/impl.hpp @@ -10,16 +10,72 @@ #define BOOST_PROTO_TRANSFORM_IMPL_HPP_EAN_04_03_2008 #include <boost/config.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/type_traits/add_const.hpp> +#include <boost/type_traits/add_reference.hpp> #include <boost/proto/proto_fwd.hpp> +#include <boost/proto/detail/any.hpp> +#include <boost/proto/detail/static_const.hpp> -#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable : 4714) // function 'xxx' marked as __forceinline not inlined #endif namespace boost { namespace proto { -#ifdef BOOST_NO_RVALUE_REFERENCES + namespace envns_ + { + //////////////////////////////////////////////////////////////////////////////////////////// + struct key_not_found + {}; + + //////////////////////////////////////////////////////////////////////////////////////////// + // empty_env + struct empty_env + { + typedef void proto_environment_; + + template<typename OtherTag, typename OtherValue = key_not_found> + struct lookup + { + typedef OtherValue type; + typedef + typename add_reference<typename add_const<OtherValue>::type>::type + const_reference; + }; + + key_not_found operator[](detail::any) const + { + return key_not_found(); + } + + template<typename T> + T const &at(detail::any, T const &t) const + { + return t; + } + }; + } + + //////////////////////////////////////////////////////////////////////////////////////////// + // is_env + template<typename T, typename Void> + struct is_env + : mpl::false_ + {}; + + template<typename T> + struct is_env<T, typename T::proto_environment_> + : mpl::true_ + {}; + + template<typename T> + struct is_env<T &, void> + : is_env<T> + {}; + +#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES /// INTERNAL ONLY /// @@ -39,8 +95,19 @@ namespace boost { namespace proto typename boost::proto::detail::apply_transform<transform_type(Expr &)>::result_type \ operator ()(Expr &e) const \ { \ - int i = 0; \ - return boost::proto::detail::apply_transform<transform_type(Expr &)>()(e, i, i); \ + boost::proto::empty_state s = 0; \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr &)>()(e, s, d); \ + } \ + \ + template<typename Expr> \ + BOOST_FORCEINLINE \ + typename boost::proto::detail::apply_transform<transform_type(Expr const &)>::result_type \ + operator ()(Expr const &e) const \ + { \ + boost::proto::empty_state s = 0; \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr const &)>()(e, s, d); \ } \ \ template<typename Expr, typename State> \ @@ -48,8 +115,17 @@ namespace boost { namespace proto typename boost::proto::detail::apply_transform<transform_type(Expr &, State &)>::result_type \ operator ()(Expr &e, State &s) const \ { \ - int i = 0; \ - return boost::proto::detail::apply_transform<transform_type(Expr &, State &)>()(e, s, i); \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr &, State &)>()(e, s, d); \ + } \ + \ + template<typename Expr, typename State> \ + BOOST_FORCEINLINE \ + typename boost::proto::detail::apply_transform<transform_type(Expr const &, State &)>::result_type \ + operator ()(Expr const &e, State &s) const \ + { \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr const &, State &)>()(e, s, d); \ } \ \ template<typename Expr, typename State> \ @@ -57,8 +133,17 @@ namespace boost { namespace proto typename boost::proto::detail::apply_transform<transform_type(Expr &, State const &)>::result_type \ operator ()(Expr &e, State const &s) const \ { \ - int i = 0; \ - return boost::proto::detail::apply_transform<transform_type(Expr &, State const &)>()(e, s, i); \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr &, State const &)>()(e, s, d); \ + } \ + \ + template<typename Expr, typename State> \ + BOOST_FORCEINLINE \ + typename boost::proto::detail::apply_transform<transform_type(Expr const &, State const &)>::result_type \ + operator ()(Expr const &e, State const &s) const \ + { \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr const &, State const &)>()(e, s, d); \ } \ \ template<typename Expr, typename State, typename Data> \ @@ -71,11 +156,27 @@ namespace boost { namespace proto \ template<typename Expr, typename State, typename Data> \ BOOST_FORCEINLINE \ + typename boost::proto::detail::apply_transform<transform_type(Expr const &, State &, Data &)>::result_type \ + operator ()(Expr const &e, State &s, Data &d) const \ + { \ + return boost::proto::detail::apply_transform<transform_type(Expr const &, State &, Data &)>()(e, s, d); \ + } \ + \ + template<typename Expr, typename State, typename Data> \ + BOOST_FORCEINLINE \ typename boost::proto::detail::apply_transform<transform_type(Expr &, State const &, Data &)>::result_type \ operator ()(Expr &e, State const &s, Data &d) const \ { \ return boost::proto::detail::apply_transform<transform_type(Expr &, State const &, Data &)>()(e, s, d); \ } \ + \ + template<typename Expr, typename State, typename Data> \ + BOOST_FORCEINLINE \ + typename boost::proto::detail::apply_transform<transform_type(Expr const &, State const &, Data &)>::result_type \ + operator ()(Expr const &e, State const &s, Data &d) const \ + { \ + return boost::proto::detail::apply_transform<transform_type(Expr const &, State const &, Data &)>()(e, s, d); \ + } \ /**/ #else @@ -98,8 +199,9 @@ namespace boost { namespace proto typename boost::proto::detail::apply_transform<transform_type(Expr const &)>::result_type \ operator ()(Expr &&e) const \ { \ - int i = 0; \ - return boost::proto::detail::apply_transform<transform_type(Expr const &)>()(e, i, i); \ + boost::proto::empty_state s = 0; \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr const &)>()(e, s, d); \ } \ \ template<typename Expr, typename State> \ @@ -107,8 +209,8 @@ namespace boost { namespace proto typename boost::proto::detail::apply_transform<transform_type(Expr const &, State const &)>::result_type \ operator ()(Expr &&e, State &&s) const \ { \ - int i = 0; \ - return boost::proto::detail::apply_transform<transform_type(Expr const &, State const &)>()(e, s, i); \ + boost::proto::empty_env d; \ + return boost::proto::detail::apply_transform<transform_type(Expr const &, State const &)>()(e, s, d); \ } \ \ template<typename Expr, typename State, typename Data> \ @@ -133,12 +235,12 @@ namespace boost { namespace proto template<typename PrimitiveTransform, typename Expr> struct apply_transform<PrimitiveTransform(Expr)> - : PrimitiveTransform::template impl<Expr, int, int> + : PrimitiveTransform::template impl<Expr, empty_state, empty_env> {}; template<typename PrimitiveTransform, typename Expr, typename State> struct apply_transform<PrimitiveTransform(Expr, State)> - : PrimitiveTransform::template impl<Expr, State, int> + : PrimitiveTransform::template impl<Expr, State, empty_env> {}; template<typename PrimitiveTransform, typename Expr, typename State, typename Data> @@ -243,7 +345,7 @@ namespace boost { namespace proto }} // namespace boost::proto -#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#if defined(_MSC_VER) # pragma warning(pop) #endif |