From 63dea93d99a5157cfde519a6e845ff340942c43d Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Wed, 9 May 2018 19:14:50 +0100 Subject: [PATCH] is_virtual_base_of.hpp: Reinstate old version for old broken compilers. --- .../boost/type_traits/is_virtual_base_of.hpp | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/include/boost/type_traits/is_virtual_base_of.hpp b/include/boost/type_traits/is_virtual_base_of.hpp index 1321f22..d2efebb 100644 --- a/include/boost/type_traits/is_virtual_base_of.hpp +++ b/include/boost/type_traits/is_virtual_base_of.hpp @@ -10,6 +10,7 @@ #define BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED #include +#include namespace boost { namespace detail { @@ -22,6 +23,8 @@ namespace detail { #pragma GCC system_header #endif +#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_CXX11_NULLPTR) + template struct is_virtual_base_of_impl { @@ -60,6 +63,84 @@ struct is_virtual_base_of_impl template struct is_virtual_base_of : public integral_constant::value)>{}; +#else + + template + struct is_virtual_base_of_impl + { + BOOST_STATIC_CONSTANT(bool, value = false); + }; + + template + struct is_virtual_base_of_impl + { + union max_align + { + unsigned u; + unsigned long ul; + void* v; + double d; + long double ld; +#ifndef BOOST_NO_LONG_LONG + long long ll; +#endif + }; +#ifdef __BORLANDC__ + struct boost_type_traits_internal_struct_X : public virtual Derived, public virtual Base + { + boost_type_traits_internal_struct_X(); + boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&); + boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&); + ~boost_type_traits_internal_struct_X()throw(); + max_align data[4]; + }; + struct boost_type_traits_internal_struct_Y : public virtual Derived + { + boost_type_traits_internal_struct_Y(); + boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&); + boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&); + ~boost_type_traits_internal_struct_Y()throw(); + max_align data[4]; + }; +#else + struct boost_type_traits_internal_struct_X : public Derived, virtual Base + { + boost_type_traits_internal_struct_X(); + boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&); + boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&); + ~boost_type_traits_internal_struct_X()throw(); + max_align data[16]; + }; + struct boost_type_traits_internal_struct_Y : public Derived + { + boost_type_traits_internal_struct_Y(); + boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&); + boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&); + ~boost_type_traits_internal_struct_Y()throw(); + max_align data[16]; + }; +#endif + BOOST_STATIC_CONSTANT(bool, value = (sizeof(boost_type_traits_internal_struct_X) == sizeof(boost_type_traits_internal_struct_Y))); + }; + + template + struct is_virtual_base_of_impl2 + { + typedef boost::integral_constant::value && !boost::is_same::value)> tag_type; + typedef is_virtual_base_of_impl imp; + BOOST_STATIC_CONSTANT(bool, value = imp::value); + }; + +#ifdef BOOST_MSVC +#pragma warning( pop ) +#endif + +} // namespace detail + +template struct is_virtual_base_of : public integral_constant::value)> {}; + +#endif + template struct is_virtual_base_of : public false_type{}; template struct is_virtual_base_of : public false_type{}; template struct is_virtual_base_of : public false_type{};