Index: third_party/boost/boost/type_traits/is_convertible.hpp |
diff --git a/third_party/boost/boost/type_traits/is_convertible.hpp b/third_party/boost/boost/type_traits/is_convertible.hpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce522a08429fa6fec1faa2819048061a8e8eadd5 |
--- /dev/null |
+++ b/third_party/boost/boost/type_traits/is_convertible.hpp |
@@ -0,0 +1,430 @@ |
+ |
+// Copyright 2000 John Maddock (john@johnmaddock.co.uk) |
+// Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu) |
+// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) |
+// |
+// Use, modification and distribution are subject to 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/type_traits for most recent version including documentation. |
+ |
+#ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED |
+#define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED |
+ |
+#include <boost/type_traits/intrinsics.hpp> |
+#ifndef BOOST_IS_CONVERTIBLE |
+#include <boost/type_traits/detail/yes_no_type.hpp> |
+#include <boost/type_traits/config.hpp> |
+#include <boost/type_traits/is_array.hpp> |
+#include <boost/type_traits/add_reference.hpp> |
+#include <boost/type_traits/ice.hpp> |
+#include <boost/type_traits/is_arithmetic.hpp> |
+#include <boost/type_traits/is_void.hpp> |
+#ifndef BOOST_NO_IS_ABSTRACT |
+#include <boost/type_traits/is_abstract.hpp> |
+#endif |
+ |
+#if defined(__MWERKS__) |
+#include <boost/type_traits/is_function.hpp> |
+#include <boost/type_traits/remove_reference.hpp> |
+#endif |
+ |
+#endif // BOOST_IS_CONVERTIBLE |
+ |
+// should be always the last #include directive |
+#include <boost/type_traits/detail/bool_trait_def.hpp> |
+ |
+namespace boost { |
+ |
+#ifndef BOOST_IS_CONVERTIBLE |
+ |
+// is one type convertable to another? |
+// |
+// there are multiple versions of the is_convertible |
+// template, almost every compiler seems to require its |
+// own version. |
+// |
+// Thanks to Andrei Alexandrescu for the original version of the |
+// conversion detection technique! |
+// |
+ |
+namespace detail { |
+ |
+// MS specific version: |
+ |
+#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) |
+ |
+// This workaround is necessary to handle when From is void |
+// which is normally taken care of by the partial specialization |
+// of the is_convertible typename. |
+using ::boost::type_traits::yes_type; |
+using ::boost::type_traits::no_type; |
+ |
+template< typename From > |
+struct does_conversion_exist |
+{ |
+ template< typename To > struct result_ |
+ { |
+ static no_type BOOST_TT_DECL _m_check(...); |
+ static yes_type BOOST_TT_DECL _m_check(To); |
+ static From _m_from; |
+ enum { value = sizeof( _m_check(_m_from) ) == sizeof(yes_type) }; |
+ }; |
+}; |
+ |
+template<> |
+struct does_conversion_exist<void> |
+{ |
+ template< typename To > struct result_ |
+ { |
+ enum { value = ::boost::is_void<To>::value }; |
+ }; |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl |
+ : does_conversion_exist<From>::template result_<To> |
+{ |
+}; |
+ |
+#elif defined(__BORLANDC__) && (__BORLANDC__ < 0x560) |
+// |
+// special version for Borland compilers |
+// this version breaks when used for some |
+// UDT conversions: |
+// |
+template <typename From, typename To> |
+struct is_convertible_impl |
+{ |
+#pragma option push -w-8074 |
+ // This workaround for Borland breaks the EDG C++ frontend, |
+ // so we only use it for Borland. |
+ template <typename T> struct checker |
+ { |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T); |
+ }; |
+ |
+ static From _m_from; |
+ static bool const value = sizeof( checker<To>::_m_check(_m_from) ) |
+ == sizeof(::boost::type_traits::yes_type); |
+#pragma option pop |
+}; |
+ |
+#elif defined(__GNUC__) || defined(__BORLANDC__) && (__BORLANDC__ < 0x600) |
+// special version for gcc compiler + recent Borland versions |
+// note that this does not pass UDT's through (...) |
+ |
+struct any_conversion |
+{ |
+ template <typename T> any_conversion(const volatile T&); |
+ template <typename T> any_conversion(T&); |
+}; |
+ |
+template <typename T> struct checker |
+{ |
+ static boost::type_traits::no_type _m_check(any_conversion ...); |
+ static boost::type_traits::yes_type _m_check(T, int); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl |
+{ |
+ static From _m_from; |
+ static bool const value = sizeof( detail::checker<To>::_m_check(_m_from, 0) ) |
+ == sizeof(::boost::type_traits::yes_type); |
+}; |
+ |
+#elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \ |
+ || defined(__IBMCPP__) || defined(__HP_aCC) |
+// |
+// This is *almost* an ideal world implementation as it doesn't rely |
+// on undefined behaviour by passing UDT's through (...). |
+// Unfortunately it doesn't quite pass all the tests for most compilers (sigh...) |
+// Enable this for your compiler if is_convertible_test.cpp will compile it... |
+// |
+// Note we do not enable this for VC7.1, because even though it passes all the |
+// type_traits tests it is known to cause problems when instantiation occurs |
+// deep within the instantiation tree :-( |
+// |
+struct any_conversion |
+{ |
+ template <typename T> any_conversion(const volatile T&); |
+ // we need this constructor to catch references to functions |
+ // (which can not be cv-qualified): |
+ template <typename T> any_conversion(T&); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl |
+{ |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); |
+ static From _m_from; |
+ |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) |
+ ); |
+}; |
+ |
+#elif defined(__DMC__) |
+ |
+struct any_conversion |
+{ |
+ template <typename T> any_conversion(const volatile T&); |
+ // we need this constructor to catch references to functions |
+ // (which can not be cv-qualified): |
+ template <typename T> any_conversion(T&); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl |
+{ |
+ // Using '...' doesn't always work on Digital Mars. This version seems to. |
+ template <class T> |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion, float, T); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int); |
+ static From _m_from; |
+ |
+ // Static constants sometime cause the conversion of _m_from to To to be |
+ // called. This doesn't happen with an enum. |
+ enum { value = |
+ sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type) |
+ }; |
+}; |
+ |
+#elif defined(__MWERKS__) |
+// |
+// CW works with the technique implemented above for EDG, except when From |
+// is a function type (or a reference to such a type), in which case |
+// any_conversion won't be accepted as a valid conversion. We detect this |
+// exceptional situation and channel it through an alternative algorithm. |
+// |
+ |
+template <typename From, typename To,bool FromIsFunctionRef> |
+struct is_convertible_basic_impl_aux; |
+ |
+struct any_conversion |
+{ |
+ template <typename T> any_conversion(const volatile T&); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl_aux<From,To,false /*FromIsFunctionRef*/> |
+{ |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); |
+ static From _m_from; |
+ |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type) |
+ ); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl_aux<From,To,true /*FromIsFunctionRef*/> |
+{ |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); |
+ static From _m_from; |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) |
+ ); |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_basic_impl: |
+ is_convertible_basic_impl_aux< |
+ From,To, |
+ ::boost::is_function<typename ::boost::remove_reference<From>::type>::value |
+ > |
+{}; |
+ |
+#else |
+ |
+// |
+// This version seems to work pretty well for a wide spectrum of compilers, |
+// however it does rely on undefined behaviour by passing UDT's through (...). |
+// |
+template <typename From, typename To> |
+struct is_convertible_basic_impl |
+{ |
+ static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); |
+ static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); |
+ static From _m_from; |
+#ifdef BOOST_MSVC |
+#pragma warning(push) |
+#pragma warning(disable:4244) |
+#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000) |
+#pragma warning(disable:6334) |
+#endif |
+#endif |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type) |
+ ); |
+#ifdef BOOST_MSVC |
+#pragma warning(pop) |
+#endif |
+}; |
+ |
+#endif // is_convertible_impl |
+ |
+#if defined(__DMC__) |
+// As before, a static constant sometimes causes errors on Digital Mars. |
+template <typename From, typename To> |
+struct is_convertible_impl |
+{ |
+ typedef typename add_reference<From>::type ref_type; |
+ enum { value = |
+ (::boost::type_traits::ice_and< |
+ ::boost::type_traits::ice_or< |
+ ::boost::detail::is_convertible_basic_impl<ref_type,To>::value, |
+ ::boost::is_void<To>::value |
+ >::value, |
+ ::boost::type_traits::ice_not< |
+ ::boost::is_array<To>::value |
+ >::value |
+ >::value) }; |
+}; |
+#elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551 |
+template <typename From, typename To> |
+struct is_convertible_impl |
+{ |
+ typedef typename add_reference<From>::type ref_type; |
+ BOOST_STATIC_CONSTANT(bool, value = |
+ (::boost::type_traits::ice_and< |
+ ::boost::type_traits::ice_or< |
+ ::boost::detail::is_convertible_basic_impl<ref_type,To>::value, |
+ ::boost::is_void<To>::value |
+ >::value, |
+ ::boost::type_traits::ice_not< |
+ ::boost::is_array<To>::value |
+ >::value |
+ >::value) |
+ ); |
+}; |
+#endif |
+ |
+template <bool trivial1, bool trivial2, bool abstract_target> |
+struct is_convertible_impl_select |
+{ |
+ template <class From, class To> |
+ struct rebind |
+ { |
+ typedef is_convertible_impl<From, To> type; |
+ }; |
+}; |
+ |
+template <> |
+struct is_convertible_impl_select<true, true, false> |
+{ |
+ template <class From, class To> |
+ struct rebind |
+ { |
+ typedef true_type type; |
+ }; |
+}; |
+ |
+template <> |
+struct is_convertible_impl_select<false, false, true> |
+{ |
+ template <class From, class To> |
+ struct rebind |
+ { |
+ typedef false_type type; |
+ }; |
+}; |
+ |
+template <> |
+struct is_convertible_impl_select<true, false, true> |
+{ |
+ template <class From, class To> |
+ struct rebind |
+ { |
+ typedef false_type type; |
+ }; |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_impl_dispatch_base |
+{ |
+#if !BOOST_WORKAROUND(__HP_aCC, < 60700) |
+ typedef is_convertible_impl_select< |
+ ::boost::is_arithmetic<From>::value, |
+ ::boost::is_arithmetic<To>::value, |
+#ifndef BOOST_NO_IS_ABSTRACT |
+ ::boost::is_abstract<To>::value |
+#else |
+ false |
+#endif |
+ > selector; |
+#else |
+ typedef is_convertible_impl_select<false, false, false> selector; |
+#endif |
+ typedef typename selector::template rebind<From, To> isc_binder; |
+ typedef typename isc_binder::type type; |
+}; |
+ |
+template <typename From, typename To> |
+struct is_convertible_impl_dispatch |
+ : public is_convertible_impl_dispatch_base<From, To>::type |
+{}; |
+ |
+// |
+// Now add the full and partial specialisations |
+// for void types, these are common to all the |
+// implementation above: |
+// |
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS |
+# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \ |
+ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2,value) \ |
+ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const,value) \ |
+ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 volatile,value) \ |
+ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const volatile,value) \ |
+ /**/ |
+ |
+# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(trait,spec1,spec2,value) \ |
+ TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \ |
+ TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const,spec2,value) \ |
+ TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 volatile,spec2,value) \ |
+ TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const volatile,spec2,value) \ |
+ /**/ |
+ |
+ TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(is_convertible,void,void,true) |
+ |
+# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2 |
+# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1 |
+ |
+#else |
+ BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(is_convertible,void,void,true) |
+#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS |
+ |
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void,To,false) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void,true) |
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const,To,false) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void volatile,To,false) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const volatile,To,false) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const,true) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void volatile,true) |
+BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const volatile,true) |
+#endif |
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
+ |
+} // namespace detail |
+ |
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,(::boost::detail::is_convertible_impl_dispatch<From,To>::value)) |
+ |
+#else |
+ |
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,BOOST_IS_CONVERTIBLE(From,To)) |
+ |
+#endif |
+ |
+} // namespace boost |
+ |
+#include <boost/type_traits/detail/bool_trait_undef.hpp> |
+ |
+#endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED |