$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78490 - in trunk/boost/fusion: . adapted/adt/detail sequence/comparison/detail support
From: joel_at_[hidden]
Date: 2012-05-16 21:10:22
Author: djowel
Date: 2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
New Revision: 78490
URL: http://svn.boost.org/trac/boost/changeset/78490
Log:
Patch by Nathan Ridge to allow BOOST_FUSION_ADAPT_ADT adapted classes to be compared using relational operators.
Added:
   trunk/boost/fusion/support/as_const.hpp   (contents, props changed)
Text files modified: 
   trunk/boost/fusion/adapted/adt/detail/extension.hpp             |    29 ++++++++++++++++++++++-------           
   trunk/boost/fusion/sequence/comparison/detail/equal_to.hpp      |     3 ++-                                     
   trunk/boost/fusion/sequence/comparison/detail/greater.hpp       |     6 ++++--                                  
   trunk/boost/fusion/sequence/comparison/detail/greater_equal.hpp |     6 ++++--                                  
   trunk/boost/fusion/sequence/comparison/detail/less.hpp          |     6 ++++--                                  
   trunk/boost/fusion/sequence/comparison/detail/less_equal.hpp    |     6 ++++--                                  
   trunk/boost/fusion/sequence/comparison/detail/not_equal_to.hpp  |     3 ++-                                     
   trunk/boost/fusion/support.hpp                                  |     1 +                                       
   8 files changed, 43 insertions(+), 17 deletions(-)
Modified: trunk/boost/fusion/adapted/adt/detail/extension.hpp
==============================================================================
--- trunk/boost/fusion/adapted/adt/detail/extension.hpp	(original)
+++ trunk/boost/fusion/adapted/adt/detail/extension.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,13 +12,28 @@
 
 #include <boost/type_traits/remove_const.hpp>
 #include <boost/type_traits/remove_reference.hpp>
+#include <boost/fusion/support/as_const.hpp>
+#include <boost/fusion/adapted/struct/detail/extension.hpp>
 
-namespace boost { namespace fusion { namespace detail
-{
-    template <typename T, typename Dummy>
-    struct get_identity
-      : remove_const<typename remove_reference<T>::type>
-    {};
-}}}
+namespace boost { namespace fusion
+{ 
+    namespace detail
+    {
+        template <typename T, typename Dummy>
+        struct get_identity
+          : remove_const<typename remove_reference<T>::type>
+        {};
+    }
+    
+    namespace extension
+    {
+        // Overload as_const() to unwrap adt_attribute_proxy.
+        template <typename T, int N, bool Const>
+        typename adt_attribute_proxy<T, N, Const>::type as_const(const adt_attribute_proxy<T, N, Const>& proxy)
+        {
+            return proxy.get();
+        }
+    }
+}}
 
 #endif
Modified: trunk/boost/fusion/sequence/comparison/detail/equal_to.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/equal_to.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/equal_to.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,7 +33,7 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a == *b
+            return extension::as_const(*a) == extension::as_const(*b)
                 && call(fusion::next(a), fusion::next(b));
         }
 
Modified: trunk/boost/fusion/sequence/comparison/detail/greater.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/greater.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/greater.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,8 +33,9 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a > *b ||
-                (!(*b > *a) && call(fusion::next(a), fusion::next(b)));
+            return extension::as_const(*a) > extension::as_const(*b) ||
+                (!(extension::as_const(*b) > extension::as_const(*a)) && 
+                 call(fusion::next(a), fusion::next(b)));
         }
 
         template <typename I1, typename I2>
Modified: trunk/boost/fusion/sequence/comparison/detail/greater_equal.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/greater_equal.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/greater_equal.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,8 +33,9 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a >= *b
-                && (!(*b >= *a) || call(fusion::next(a), fusion::next(b)));
+            return extension::as_const(*a) >= extension::as_const(*b)
+                && (!(extension::as_const(*b) >= extension::as_const(*a)) || 
+                    call(fusion::next(a), fusion::next(b)));
         }
 
         template <typename I1, typename I2>
Modified: trunk/boost/fusion/sequence/comparison/detail/less.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/less.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/less.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,8 +33,9 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a < *b ||
-                (!(*b < *a) && call(fusion::next(a), fusion::next(b)));
+            return extension::as_const(*a) < extension::as_const(*b) ||
+                (!(extension::as_const(*b) < extension::as_const(*a)) && 
+                 call(fusion::next(a), fusion::next(b)));
         }
 
         template <typename I1, typename I2>
Modified: trunk/boost/fusion/sequence/comparison/detail/less_equal.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/less_equal.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/less_equal.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,8 +33,9 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a <= *b
-                && (!(*b <= *a) || call(fusion::next(a), fusion::next(b)));
+            return extension::as_const(*a) <= extension::as_const(*b)
+                && (!(extension::as_const(*b) <= extension::as_const(*a)) || 
+                    call(fusion::next(a), fusion::next(b)));
         }
 
         template <typename I1, typename I2>
Modified: trunk/boost/fusion/sequence/comparison/detail/not_equal_to.hpp
==============================================================================
--- trunk/boost/fusion/sequence/comparison/detail/not_equal_to.hpp	(original)
+++ trunk/boost/fusion/sequence/comparison/detail/not_equal_to.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -12,6 +12,7 @@
 #include <boost/fusion/iterator/deref.hpp>
 #include <boost/fusion/iterator/next.hpp>
 #include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -32,7 +33,7 @@
         static bool
         call(I1 const& a, I2 const& b, mpl::false_)
         {
-            return *a != *b
+            return extension::as_const(*a) != extension::as_const(*b)
                 || call(fusion::next(a), fusion::next(b));
         }
 
Modified: trunk/boost/fusion/support.hpp
==============================================================================
--- trunk/boost/fusion/support.hpp	(original)
+++ trunk/boost/fusion/support.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -19,5 +19,6 @@
 #include <boost/fusion/support/deduce.hpp>
 #include <boost/fusion/support/deduce_sequence.hpp>
 #include <boost/fusion/support/unused.hpp>
+#include <boost/fusion/support/as_const.hpp>
 
 #endif
Added: trunk/boost/fusion/support/as_const.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/fusion/support/as_const.hpp	2012-05-16 21:10:20 EDT (Wed, 16 May 2012)
@@ -0,0 +1,26 @@
+/*=============================================================================
+    Copyright (c) 2012 Nathan Ridge
+
+    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_FUSION_SUPPORT_AS_CONST_HPP
+#define BOOST_FUSION_SUPPORT_AS_CONST_HPP
+
+namespace boost { namespace fusion { namespace extension
+{
+    // A customization point that allows certain wrappers around
+    // Fusion sequence elements (e.g. adt_attribute_proxy) to be
+    // unwrapped in contexts where the element only needs to be
+    // read. The library wraps accesses to Fusion elements in
+    // such contexts with calls to this function. Users can
+    // specialize this function for their own wrappers.
+    template <typename T>
+    const T& as_const(const T& obj)
+    {
+        return obj;
+    }
+
+}}}
+
+#endif