diff DEPENDENCIES/generic/include/boost/phoenix/bind/detail/member_variable.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/bind/detail/member_variable.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,87 @@
+/*=============================================================================
+    Copyright (c) 2001-2007 Joel de Guzman
+
+    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_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP
+#define BOOST_PHOENIX_CORE_DETAIL_MEMBER_VARIABLE_HPP
+
+#include <boost/proto/detail/decltype.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4180) // qualifier applied to function type has no meaning; ignored
+#endif
+
+namespace boost { namespace phoenix { namespace detail {
+
+        template <typename RT, typename MP>
+        struct member_variable
+        {
+            template <typename Sig>
+            struct result;
+
+            template <typename This, typename Class>
+            struct result<This(Class)>
+                : result<This(Class const &)>
+            {};
+
+            template <typename This, typename Class>
+            struct result<This(Class &)>
+            {
+                typedef typename boost::mpl::if_c<
+                    boost::is_const<
+                        typename boost::remove_pointer<
+                            typename boost::remove_reference<Class>::type
+                        >::type
+                    >::value
+                  , const RT&
+                  , RT&
+                >::type
+                type;
+            };
+
+            member_variable(MP mp)
+                : mp(mp) {}
+
+            template <typename Class>
+            RT& operator()(Class& obj) const
+            {
+                BOOST_PROTO_USE_GET_POINTER();
+
+                typedef typename proto::detail::class_member_traits<MP>::class_type class_type;
+                return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp);
+            }
+
+            template <typename Class>
+            RT const& operator()(Class const& obj) const
+            {
+                BOOST_PROTO_USE_GET_POINTER();
+
+                typedef typename proto::detail::class_member_traits<MP>::class_type class_type;
+                return (BOOST_PROTO_GET_POINTER(class_type, obj)->*mp);
+            }
+
+            template <typename Class>
+            RT& operator()(Class* obj) const
+            {
+                return obj->*mp;
+            }
+
+            template <typename Class>
+            RT const& operator()(Class const* obj) const
+            {
+                return obj->*mp;
+            }
+
+            MP mp;
+        };
+}}}
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#endif