From df3f753ef38721f6c52ab08e641f02fd16113cea Mon Sep 17 00:00:00 2001 From: Jonathan Turkanis Date: Sun, 9 Oct 2005 03:11:46 +0000 Subject: [PATCH] first try at fixing is_incrementable for gcc 4.0.2 [SVN r31243] --- include/boost/detail/is_incrementable.hpp | 37 ++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/include/boost/detail/is_incrementable.hpp b/include/boost/detail/is_incrementable.hpp index 5ec7c27..a2f4cb7 100755 --- a/include/boost/detail/is_incrementable.hpp +++ b/include/boost/detail/is_incrementable.hpp @@ -9,10 +9,9 @@ # include # include # include +# include // BOOST_INTEL # include -namespace boost { namespace detail { - // is_incrementable metafunction // // Requires: Given x of type T&, if the expression ++x is well-formed @@ -31,10 +30,32 @@ namespace is_incrementable_ // might be found via ADL. struct any { template any(T const&); }; +# if defined(__GNUC_PATCHLEVEL__) && !defined(BOOST_INTEL) +# define BOOST_IS_INCREMENTABLE_GCC \ + ((__GNUC__ * 100UL + __GNUC_MINOR__) * 100UL + __GNUC_PATCHLEVEL__) \ + /**/ +# else +# define BOOST_IS_INCREMENTABLE_GCC 0 +# endif + +# if BOOST_WORKAROUND(BOOST_IS_INCREMENTABLE_GCC, >= 40002) + + } // namespace is_incrementable_ + + // This is a last-resort operator++ for when none other is found + is_incrementable_::tag operator++(is_incrementable_::any const&); + is_incrementable_::tag operator++(is_incrementable_::any const&,int); + + namespace is_incrementable_ { + +# else + // This is a last-resort operator++ for when none other is found tag operator++(any const&); tag operator++(any const&,int); +# endif + # if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \ || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) # define BOOST_comma(a,b) (a) @@ -72,23 +93,25 @@ namespace is_incrementable_ , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1 ); }; -} +} // namespace is_incrementable_ + +namespace boost { namespace detail { # undef BOOST_comma template struct is_incrementable - BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) + BOOST_TT_AUX_BOOL_C_BASE(::is_incrementable_::impl::value) { - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl::value) + BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::is_incrementable_::impl::value) BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T)) }; template struct is_postfix_incrementable - BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl::value) + BOOST_TT_AUX_BOOL_C_BASE(::is_incrementable_::impl::value) { - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl::value) + BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::is_incrementable_::postfix_impl::value) BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T)) };