diff --git a/include/boost/mpl/aux_/config/overload_resolution.hpp b/include/boost/mpl/aux_/config/overload_resolution.hpp index 009ccc8..dca8c52 100644 --- a/include/boost/mpl/aux_/config/overload_resolution.hpp +++ b/include/boost/mpl/aux_/config/overload_resolution.hpp @@ -18,11 +18,15 @@ #define BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED #include "boost/config.hpp" +#include "boost/detail/workaround.hpp" -#if defined(__BORLANDC__) && (__BORLANDC__ <= 0x561 || !defined(BOOST_STRICT_CONFIG)) \ - || defined(__MWERKS__) && __MWERKS__ < 0x3001 \ - && !defined(BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION) -# define BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION +#if !defined(BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION) + +# if BOOST_WORKAROUND(__BORLANDC__, <= 0x561) || BOOST_WORKAROUND(__MWERKS__, < 0x3001) + +# define BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION + +# endif #endif #endif // BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED diff --git a/include/boost/mpl/aux_/has_xxx.hpp b/include/boost/mpl/aux_/has_xxx.hpp index 631ce22..987ae12 100644 --- a/include/boost/mpl/aux_/has_xxx.hpp +++ b/include/boost/mpl/aux_/has_xxx.hpp @@ -22,41 +22,42 @@ #include "boost/mpl/aux_/config/msvc_typename.hpp" #include "boost/mpl/aux_/config/overload_resolution.hpp" #include "boost/mpl/aux_/config/static_constant.hpp" +#include "boost/detail/workaround.hpp" -#if !defined(BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION) && (!defined(__GNUC__) || __GNUC__ == 3) +#if !defined(BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION) && !BOOST_WORKAROUND(__GNUC__, <= 2) -# if (!defined(BOOST_MSVC) || BOOST_MSVC > 1300) +# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) // the implementation below is based on a USENET newsgroup's posting by // Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST) -# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ -template< typename T > \ -boost::mpl::aux::yes_tag \ -trait##_helper( \ - boost::mpl::aux::type_wrapper const volatile* \ - , boost::mpl::aux::type_wrapper* = 0 \ - ); \ -\ -boost::mpl::aux::no_tag \ -trait##_helper(...); \ -\ -template< typename T > \ -struct trait \ -{ \ - typedef boost::mpl::aux::type_wrapper t_; \ - BOOST_STATIC_CONSTANT(bool, value = \ - sizeof((trait##_helper)(static_cast(0))) \ - == sizeof(boost::mpl::aux::yes_tag) \ - ); \ -}; \ +# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ +template< typename T > \ +boost::mpl::aux::yes_tag \ +trait##_helper( \ + boost::mpl::aux::type_wrapper const volatile* \ + , boost::mpl::aux::type_wrapper* = 0 \ + ); \ + \ +boost::mpl::aux::no_tag \ +trait##_helper(...); \ + \ +template< typename T > \ +struct trait \ +{ \ + typedef boost::mpl::aux::type_wrapper t_; \ + BOOST_STATIC_CONSTANT(bool, value = \ + sizeof((trait##_helper)(static_cast(0))) \ + == sizeof(boost::mpl::aux::yes_tag) \ + ); \ +}; \ /**/ # else -#include "boost/mpl/if.hpp" -#include "boost/mpl/bool.hpp" -#include "boost/preprocessor/cat.hpp" +# include "boost/mpl/if.hpp" +# include "boost/mpl/bool.hpp" +# include "boost/preprocessor/cat.hpp" // agurt, 11/sep/02: MSVC version, based on a USENET newsgroup's posting by // John Madsen (comp.lang.c++.moderated, 1999-11-12 19:17:06 GMT); @@ -86,63 +87,67 @@ struct msvc_is_incomplete }}} -# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ -template< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \ -struct BOOST_PP_CAT(trait,_impl) : T \ -{ \ - private: \ - static boost::mpl::aux::no_tag test(void(*)(::boost::mpl::aux::has_xxx_tag)); \ - static boost::mpl::aux::yes_tag test(...); \ -\ - public: \ - BOOST_STATIC_CONSTANT(bool, value = \ - sizeof(test(static_cast(0))) \ - != sizeof(boost::mpl::aux::no_tag) \ - ); \ -}; \ -\ -template< typename T > struct trait \ - : boost::mpl::if_c< \ - boost::mpl::aux::msvc_is_incomplete::value \ - , boost::mpl::bool_ \ - , BOOST_PP_CAT(trait,_impl) \ - >::type \ -{ \ -}; \ -\ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \ -BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \ +# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ +template< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \ +struct BOOST_PP_CAT(trait,_impl) : T \ +{ \ + private: \ + static boost::mpl::aux::no_tag test(void(*)(::boost::mpl::aux::has_xxx_tag)); \ + static boost::mpl::aux::yes_tag test(...); \ + \ + public: \ + BOOST_STATIC_CONSTANT(bool, value = \ + sizeof(test(static_cast(0))) \ + != sizeof(boost::mpl::aux::no_tag) \ + ); \ +}; \ + \ +template< typename T > struct trait \ + : boost::mpl::if_c< \ + boost::mpl::aux::msvc_is_incomplete::value \ + , boost::mpl::bool_ \ + , BOOST_PP_CAT(trait,_impl) \ + >::type \ +{ \ +}; \ + \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \ +BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \ /**/ -# define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \ -template<> struct trait \ -{ \ - BOOST_STATIC_CONSTANT(bool,value = false); \ -}; \ +# define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \ +template<> struct trait \ +{ \ + BOOST_STATIC_CONSTANT(bool,value = false); \ +}; \ /**/ -#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) -# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ - BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ - BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \ - /**/ -#else -# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ - BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ - /**/ -#endif +# if !defined(BOOST_NO_INTRINSIC_WCHAR_T) + +# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ + BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ + BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \ + /**/ + +# else + +# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ + BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ + /**/ + +# endif # endif // BOOST_MSVC > 1300 @@ -151,18 +156,18 @@ template<> struct trait \ // agurt, 11/jan/03: signals a stub-only implementation # define BOOST_NO_MPL_AUX_HAS_XXX -# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_value) \ -template< typename T > \ -struct trait \ -{ \ - BOOST_STATIC_CONSTANT(bool, value = default_value); \ -}; \ +# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_value) \ +template< typename T > \ +struct trait \ +{ \ + BOOST_STATIC_CONSTANT(bool, value = default_value); \ +}; \ /**/ #endif // BOOST_MPL_BROKEN_OVERLOAD_RESOLUTION -#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \ -BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_##name, name, false) \ +#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \ +BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_##name, name, false) \ /**/ #endif // BOOST_MPL_AUX_HAS_XXX_HPP_INCLUDED