Index: third_party/boost/boost/mpl/has_xxx.hpp |
diff --git a/third_party/boost/boost/mpl/has_xxx.hpp b/third_party/boost/boost/mpl/has_xxx.hpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dea85ced20ae5821af5e871b478eab671ab7d602 |
--- /dev/null |
+++ b/third_party/boost/boost/mpl/has_xxx.hpp |
@@ -0,0 +1,272 @@ |
+ |
+#ifndef BOOST_MPL_HAS_XXX_HPP_INCLUDED |
+#define BOOST_MPL_HAS_XXX_HPP_INCLUDED |
+ |
+// Copyright Aleksey Gurtovoy 2002-2006 |
+// Copyright David Abrahams 2002-2003 |
+// |
+// 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) |
+// |
+// See http://www.boost.org/libs/mpl for documentation. |
+ |
+// $Source$ |
+// $Date: 2007-11-25 13:07:19 -0500 (Sun, 25 Nov 2007) $ |
+// $Revision: 41369 $ |
+ |
+#include <boost/mpl/bool.hpp> |
+#include <boost/mpl/aux_/type_wrapper.hpp> |
+#include <boost/mpl/aux_/yes_no.hpp> |
+#include <boost/mpl/aux_/config/has_xxx.hpp> |
+#include <boost/mpl/aux_/config/msvc_typename.hpp> |
+#include <boost/mpl/aux_/config/msvc.hpp> |
+#include <boost/mpl/aux_/config/static_constant.hpp> |
+#include <boost/mpl/aux_/config/workaround.hpp> |
+ |
+#include <boost/preprocessor/cat.hpp> |
+ |
+#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) ) |
+# include <boost/type_traits/is_class.hpp> |
+#endif |
+ |
+#if !defined(BOOST_MPL_CFG_NO_HAS_XXX) |
+ |
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) |
+ |
+// agurt, 11/sep/02: MSVC-specific version (< 7.1), based on a USENET |
+// newsgroup's posting by John Madsen (comp.lang.c++.moderated, |
+// 1999-11-12 19:17:06 GMT); the code is _not_ standard-conforming, but |
+// it works way more reliably than the SFINAE-based implementation |
+ |
+// Modified dwa 8/Oct/02 to handle reference types. |
+ |
+# include <boost/mpl/if.hpp> |
+# include <boost/mpl/bool.hpp> |
+ |
+namespace boost { namespace mpl { namespace aux { |
+ |
+struct has_xxx_tag; |
+ |
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300) |
+template< typename U > struct msvc_incomplete_array |
+{ |
+ typedef char (&type)[sizeof(U) + 1]; |
+}; |
+#endif |
+ |
+template< typename T > |
+struct msvc_is_incomplete |
+{ |
+ // MSVC is capable of some kinds of SFINAE. If U is an incomplete |
+ // type, it won't pick the second overload |
+ static char tester(...); |
+ |
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300) |
+ template< typename U > |
+ static typename msvc_incomplete_array<U>::type tester(type_wrapper<U>); |
+#else |
+ template< typename U > |
+ static char (& tester(type_wrapper<U>) )[sizeof(U)+1]; |
+#endif |
+ |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ sizeof(tester(type_wrapper<T>())) == 1 |
+ ); |
+}; |
+ |
+template<> |
+struct msvc_is_incomplete<int> |
+{ |
+ BOOST_STATIC_CONSTANT(bool, value = false); |
+}; |
+ |
+}}} |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, default_) \ |
+template< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \ |
+struct BOOST_PP_CAT(trait,_impl) : T \ |
+{ \ |
+ static boost::mpl::aux::no_tag \ |
+ test(void(*)(::boost::mpl::aux::has_xxx_tag)); \ |
+ \ |
+ static boost::mpl::aux::yes_tag test(...); \ |
+ \ |
+ BOOST_STATIC_CONSTANT(bool, value = \ |
+ sizeof(test(static_cast<void(*)(name)>(0))) \ |
+ != sizeof(boost::mpl::aux::no_tag) \ |
+ ); \ |
+ typedef boost::mpl::bool_<value> type; \ |
+}; \ |
+\ |
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ |
+struct trait \ |
+ : boost::mpl::if_c< \ |
+ boost::mpl::aux::msvc_is_incomplete<T>::value \ |
+ , boost::mpl::bool_<false> \ |
+ , BOOST_PP_CAT(trait,_impl)<T> \ |
+ >::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<T> \ |
+{ \ |
+ BOOST_STATIC_CONSTANT(bool, value = false); \ |
+ typedef boost::mpl::bool_<false> type; \ |
+}; \ |
+/**/ |
+ |
+#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 |
+ |
+ |
+// SFINAE-based implementations below are derived from a USENET newsgroup's |
+// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST) |
+ |
+# elif BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \ |
+ || BOOST_WORKAROUND(__IBMCPP__, <= 700) |
+ |
+// MSVC 7.1+ & VACPP |
+ |
+// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE |
+// applied to partial specialization to fix some apparently random failures |
+// (thanks to Daniel Wallin for researching this!) |
+ |
+namespace boost { namespace mpl { namespace aux { |
+template< typename T > struct msvc71_sfinae_helper { typedef void type; }; |
+}}} |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ |
+template< typename T, typename U = void > \ |
+struct BOOST_PP_CAT(trait,_impl_) \ |
+{ \ |
+ BOOST_STATIC_CONSTANT(bool, value = false); \ |
+ typedef boost::mpl::bool_<value> type; \ |
+}; \ |
+\ |
+template< typename T > \ |
+struct BOOST_PP_CAT(trait,_impl_)< \ |
+ T \ |
+ , typename boost::mpl::aux::msvc71_sfinae_helper< typename T::name >::type \ |
+ > \ |
+{ \ |
+ BOOST_STATIC_CONSTANT(bool, value = true); \ |
+ typedef boost::mpl::bool_<value> type; \ |
+}; \ |
+\ |
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ |
+struct trait \ |
+ : BOOST_PP_CAT(trait,_impl_)<T> \ |
+{ \ |
+}; \ |
+/**/ |
+ |
+# elif BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) ) |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF(trait, trait_tester, name, default_) \ |
+template< typename T, bool IS_CLASS > \ |
+struct trait_tester \ |
+{ \ |
+ BOOST_STATIC_CONSTANT( bool, value = false ); \ |
+}; \ |
+template< typename T > \ |
+struct trait_tester< T, true > \ |
+{ \ |
+ struct trait_tester_impl \ |
+ { \ |
+ template < class U > \ |
+ static int resolve( boost::mpl::aux::type_wrapper<U> const volatile * \ |
+ , boost::mpl::aux::type_wrapper<typename U::name >* = 0 ); \ |
+ static char resolve( ... ); \ |
+ }; \ |
+ typedef boost::mpl::aux::type_wrapper<T> t_; \ |
+ BOOST_STATIC_CONSTANT( bool, value = ( sizeof( trait_tester_impl::resolve( static_cast< t_ * >(0) ) ) == sizeof(int) ) ); \ |
+}; \ |
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ |
+struct trait \ |
+{ \ |
+ BOOST_STATIC_CONSTANT( bool, value = (trait_tester< T, boost::is_class< T >::value >::value) ); \ |
+ typedef boost::mpl::bool_< trait< T, fallback_ >::value > type; \ |
+}; |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ |
+ BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF( trait \ |
+ , BOOST_PP_CAT(trait,_tester) \ |
+ , name \ |
+ , default_ ) \ |
+/**/ |
+ |
+# else // other SFINAE-capable compilers |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ |
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ |
+struct trait \ |
+{ \ |
+ struct gcc_3_2_wknd \ |
+ { \ |
+ template< typename U > \ |
+ static boost::mpl::aux::yes_tag test( \ |
+ boost::mpl::aux::type_wrapper<U> const volatile* \ |
+ , boost::mpl::aux::type_wrapper<BOOST_MSVC_TYPENAME U::name>* = 0 \ |
+ ); \ |
+ \ |
+ static boost::mpl::aux::no_tag test(...); \ |
+ }; \ |
+ \ |
+ typedef boost::mpl::aux::type_wrapper<T> t_; \ |
+ BOOST_STATIC_CONSTANT(bool, value = \ |
+ sizeof(gcc_3_2_wknd::test(static_cast<t_*>(0))) \ |
+ == sizeof(boost::mpl::aux::yes_tag) \ |
+ ); \ |
+ typedef boost::mpl::bool_<value> type; \ |
+}; \ |
+/**/ |
+ |
+# endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300) |
+ |
+ |
+#else // BOOST_MPL_CFG_NO_HAS_XXX |
+ |
+// placeholder implementation |
+ |
+# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ |
+template< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ |
+struct trait \ |
+{ \ |
+ BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \ |
+ typedef fallback_ type; \ |
+}; \ |
+/**/ |
+ |
+#endif |
+ |
+#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \ |
+ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(has_,name), name, false) \ |
+/**/ |
+ |
+#endif // BOOST_MPL_HAS_XXX_HPP_INCLUDED |