forked from boostorg/fusion
Patch by Nathan Ridge to allow BOOST_FUSION_ADAPT_ADT adapted classes to be compared using relational operators.
[SVN r78490]
This commit is contained in:
@ -12,13 +12,28 @@
|
|||||||
|
|
||||||
#include <boost/type_traits/remove_const.hpp>
|
#include <boost/type_traits/remove_const.hpp>
|
||||||
#include <boost/type_traits/remove_reference.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
|
namespace boost { namespace fusion
|
||||||
{
|
{
|
||||||
template <typename T, typename Dummy>
|
namespace detail
|
||||||
struct get_identity
|
{
|
||||||
: remove_const<typename remove_reference<T>::type>
|
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
|
#endif
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,7 +33,7 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
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));
|
&& call(fusion::next(a), fusion::next(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,8 +33,9 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
call(I1 const& a, I2 const& b, mpl::false_)
|
||||||
{
|
{
|
||||||
return *a > *b ||
|
return extension::as_const(*a) > extension::as_const(*b) ||
|
||||||
(!(*b > *a) && call(fusion::next(a), fusion::next(b)));
|
(!(extension::as_const(*b) > extension::as_const(*a)) &&
|
||||||
|
call(fusion::next(a), fusion::next(b)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename I1, typename I2>
|
template <typename I1, typename I2>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,8 +33,9 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
call(I1 const& a, I2 const& b, mpl::false_)
|
||||||
{
|
{
|
||||||
return *a >= *b
|
return extension::as_const(*a) >= extension::as_const(*b)
|
||||||
&& (!(*b >= *a) || call(fusion::next(a), fusion::next(b)));
|
&& (!(extension::as_const(*b) >= extension::as_const(*a)) ||
|
||||||
|
call(fusion::next(a), fusion::next(b)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename I1, typename I2>
|
template <typename I1, typename I2>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,8 +33,9 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
call(I1 const& a, I2 const& b, mpl::false_)
|
||||||
{
|
{
|
||||||
return *a < *b ||
|
return extension::as_const(*a) < extension::as_const(*b) ||
|
||||||
(!(*b < *a) && call(fusion::next(a), fusion::next(b)));
|
(!(extension::as_const(*b) < extension::as_const(*a)) &&
|
||||||
|
call(fusion::next(a), fusion::next(b)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename I1, typename I2>
|
template <typename I1, typename I2>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,8 +33,9 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
call(I1 const& a, I2 const& b, mpl::false_)
|
||||||
{
|
{
|
||||||
return *a <= *b
|
return extension::as_const(*a) <= extension::as_const(*b)
|
||||||
&& (!(*b <= *a) || call(fusion::next(a), fusion::next(b)));
|
&& (!(extension::as_const(*b) <= extension::as_const(*a)) ||
|
||||||
|
call(fusion::next(a), fusion::next(b)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename I1, typename I2>
|
template <typename I1, typename I2>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <boost/fusion/iterator/deref.hpp>
|
#include <boost/fusion/iterator/deref.hpp>
|
||||||
#include <boost/fusion/iterator/next.hpp>
|
#include <boost/fusion/iterator/next.hpp>
|
||||||
#include <boost/fusion/iterator/equal_to.hpp>
|
#include <boost/fusion/iterator/equal_to.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
namespace boost { namespace fusion { namespace detail
|
namespace boost { namespace fusion { namespace detail
|
||||||
{
|
{
|
||||||
@ -32,7 +33,7 @@ namespace boost { namespace fusion { namespace detail
|
|||||||
static bool
|
static bool
|
||||||
call(I1 const& a, I2 const& b, mpl::false_)
|
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));
|
|| call(fusion::next(a), fusion::next(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,5 +19,6 @@
|
|||||||
#include <boost/fusion/support/deduce.hpp>
|
#include <boost/fusion/support/deduce.hpp>
|
||||||
#include <boost/fusion/support/deduce_sequence.hpp>
|
#include <boost/fusion/support/deduce_sequence.hpp>
|
||||||
#include <boost/fusion/support/unused.hpp>
|
#include <boost/fusion/support/unused.hpp>
|
||||||
|
#include <boost/fusion/support/as_const.hpp>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
26
include/boost/fusion/support/as_const.hpp
Normal file
26
include/boost/fusion/support/as_const.hpp
Normal file
@ -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
|
Reference in New Issue
Block a user