diff --git a/include/boost/detail/is_incrementable.hpp b/include/boost/detail/is_incrementable.hpp index 5ec7c27..004b619 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 @@ -20,7 +19,7 @@ namespace boost { namespace detail { // nor violate access. // This namespace ensures that ADL doesn't mess things up. -namespace is_incrementable_ +namespace boost_is_incrementable_ { // a type returned from operator++ when no increment is found in the // type's own namespace @@ -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 boost_is_incrementable_ + + // This is a last-resort operator++ for when none other is found + boost_is_incrementable_::tag operator++(boost_is_incrementable_::any const&); + boost_is_incrementable_::tag operator++(boost_is_incrementable_::any const&,int); + + namespace boost_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) @@ -58,7 +79,7 @@ namespace is_incrementable_ BOOST_STATIC_CONSTANT( bool - , value = sizeof(is_incrementable_::check(BOOST_comma(++x,0))) == 1 + , value = sizeof(boost_is_incrementable_::check(BOOST_comma(++x,0))) == 1 ); }; @@ -69,26 +90,28 @@ namespace is_incrementable_ BOOST_STATIC_CONSTANT( bool - , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1 + , value = sizeof(boost_is_incrementable_::check(BOOST_comma(x++,0))) == 1 ); }; -} +} // namespace boost_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(::boost_is_incrementable_::impl::value) { - BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl::value) - BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T)) + BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost_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(::boost_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(::boost_is_incrementable_::postfix_impl::value) BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T)) };