Boost logo

Boost-Commit :

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


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk