summaryrefslogtreecommitdiff
path: root/boost/proto/transform/impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/proto/transform/impl.hpp')
-rw-r--r--boost/proto/transform/impl.hpp132
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