Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file impl.hpp Chris@16: /// Contains definition of transform<> and transform_impl<> helpers. Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PROTO_TRANSFORM_IMPL_HPP_EAN_04_03_2008 Chris@16: #define BOOST_PROTO_TRANSFORM_IMPL_HPP_EAN_04_03_2008 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: # pragma warning(push) Chris@16: # pragma warning(disable : 4714) // function 'xxx' marked as __forceinline not inlined Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace proto Chris@16: { Chris@16: namespace envns_ Chris@16: { Chris@16: //////////////////////////////////////////////////////////////////////////////////////////// Chris@16: struct key_not_found Chris@16: {}; Chris@16: Chris@16: //////////////////////////////////////////////////////////////////////////////////////////// Chris@16: // empty_env Chris@16: struct empty_env Chris@16: { Chris@16: typedef void proto_environment_; Chris@16: Chris@16: template Chris@16: struct lookup Chris@16: { Chris@16: typedef OtherValue type; Chris@16: typedef Chris@16: typename add_reference::type>::type Chris@16: const_reference; Chris@16: }; Chris@16: Chris@16: key_not_found operator[](detail::any) const Chris@16: { Chris@16: return key_not_found(); Chris@16: } Chris@16: Chris@16: template Chris@16: T const &at(detail::any, T const &t) const Chris@16: { Chris@16: return t; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: //////////////////////////////////////////////////////////////////////////////////////////// Chris@16: // is_env Chris@16: template Chris@16: struct is_env Chris@16: : mpl::false_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_env Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_env Chris@16: : is_env Chris@16: {}; Chris@16: Chris@16: #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: #define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \ Chris@16: BOOST_PROTO_CALLABLE() \ Chris@16: typedef X proto_is_transform_; \ Chris@16: typedef PrimitiveTransform transform_type; \ Chris@16: \ Chris@16: template \ Chris@16: struct result \ Chris@16: { \ Chris@16: typedef typename boost::proto::detail::apply_transform::result_type type; \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &e) const \ Chris@16: { \ Chris@16: boost::proto::empty_state s = 0; \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr const &e) const \ Chris@16: { \ Chris@16: boost::proto::empty_state s = 0; \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &e, State &s) const \ Chris@16: { \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr const &e, State &s) const \ Chris@16: { \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &e, State const &s) const \ Chris@16: { \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr const &e, State const &s) const \ Chris@16: { \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &e, State &s, Data &d) const \ Chris@16: { \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr const &e, State &s, Data &d) const \ Chris@16: { \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &e, State const &s, Data &d) const \ Chris@16: { \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr const &e, State const &s, Data &d) const \ Chris@16: { \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #else Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: #define BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) \ Chris@16: BOOST_PROTO_CALLABLE() \ Chris@16: typedef X proto_is_transform_; \ Chris@16: typedef PrimitiveTransform transform_type; \ Chris@16: \ Chris@16: template \ Chris@16: struct result \ Chris@16: { \ Chris@16: typedef typename boost::proto::detail::apply_transform::result_type type; \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &&e) const \ Chris@16: { \ Chris@16: boost::proto::empty_state s = 0; \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &&e, State &&s) const \ Chris@16: { \ Chris@16: boost::proto::empty_env d; \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: \ Chris@16: template \ Chris@16: BOOST_FORCEINLINE \ Chris@16: typename boost::proto::detail::apply_transform::result_type \ Chris@16: operator ()(Expr &&e, State &&s, Data &&d) const \ Chris@16: { \ Chris@16: return boost::proto::detail::apply_transform()(e, s, d); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: #endif Chris@16: Chris@16: #define BOOST_PROTO_TRANSFORM(PrimitiveTransform) \ Chris@16: BOOST_PROTO_TRANSFORM_(PrimitiveTransform, void) \ Chris@16: /**/ Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct apply_transform; Chris@16: Chris@16: template Chris@16: struct apply_transform Chris@16: : PrimitiveTransform::template impl Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct apply_transform Chris@16: : PrimitiveTransform::template impl Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct apply_transform Chris@16: : PrimitiveTransform::template impl Chris@16: {}; Chris@16: } Chris@16: Chris@16: template Chris@16: struct transform Chris@16: { Chris@16: BOOST_PROTO_TRANSFORM_(PrimitiveTransform, X) Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr const expr; Chris@16: typedef Expr const &expr_param; Chris@16: typedef State const state; Chris@16: typedef State const &state_param; Chris@16: typedef Data const data; Chris@16: typedef Data const &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr expr; Chris@16: typedef Expr &expr_param; Chris@16: typedef State const state; Chris@16: typedef State const &state_param; Chris@16: typedef Data const data; Chris@16: typedef Data const &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr const expr; Chris@16: typedef Expr const &expr_param; Chris@16: typedef State state; Chris@16: typedef State &state_param; Chris@16: typedef Data const data; Chris@16: typedef Data const &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr const expr; Chris@16: typedef Expr const &expr_param; Chris@16: typedef State const state; Chris@16: typedef State const &state_param; Chris@16: typedef Data data; Chris@16: typedef Data &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr expr; Chris@16: typedef Expr &expr_param; Chris@16: typedef State state; Chris@16: typedef State &state_param; Chris@16: typedef Data const data; Chris@16: typedef Data const &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr expr; Chris@16: typedef Expr &expr_param; Chris@16: typedef State const state; Chris@16: typedef State const &state_param; Chris@16: typedef Data data; Chris@16: typedef Data &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr const expr; Chris@16: typedef Expr const &expr_param; Chris@16: typedef State state; Chris@16: typedef State &state_param; Chris@16: typedef Data data; Chris@16: typedef Data &data_param; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct transform_impl Chris@16: { Chris@16: typedef Expr expr; Chris@16: typedef Expr &expr_param; Chris@16: typedef State state; Chris@16: typedef State &state_param; Chris@16: typedef Data data; Chris@16: typedef Data &data_param; Chris@16: }; Chris@16: Chris@16: }} // namespace boost::proto Chris@16: Chris@101: #if defined(_MSC_VER) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif