diff options
Diffstat (limited to '3rdParty/Boost/boost/type_traits/is_polymorphic.hpp')
-rw-r--r-- | 3rdParty/Boost/boost/type_traits/is_polymorphic.hpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/3rdParty/Boost/boost/type_traits/is_polymorphic.hpp b/3rdParty/Boost/boost/type_traits/is_polymorphic.hpp new file mode 100644 index 0000000..8fcc69e --- /dev/null +++ b/3rdParty/Boost/boost/type_traits/is_polymorphic.hpp @@ -0,0 +1,114 @@ +// (C) Copyright John Maddock 2000. +// 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_POLYMORPHIC_HPP +#define BOOST_TT_IS_POLYMORPHIC_HPP + +#include <boost/type_traits/intrinsics.hpp> +#ifndef BOOST_IS_POLYMORPHIC +#include <boost/type_traits/is_class.hpp> +#include <boost/type_traits/remove_cv.hpp> +#endif +// should be the last #include +#include <boost/type_traits/detail/bool_trait_def.hpp> +#include <boost/detail/workaround.hpp> + +namespace boost{ + +#ifndef BOOST_IS_POLYMORPHIC + +namespace detail{ + +template <class T> +struct is_polymorphic_imp1 +{ +# if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always. + typedef char d1, (&d2)[2]; +# else + typedef typename remove_cv<T>::type ncvT; + struct d1 : public ncvT + { + d1(); +# if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC + ~d1()throw(); +# endif + char padding[256]; + private: + // keep some picky compilers happy: + d1(const d1&); + d1& operator=(const d1&); + }; + struct d2 : public ncvT + { + d2(); + virtual ~d2()throw(); +# if !defined(BOOST_MSVC) && !defined(__ICL) + // for some reason this messes up VC++ when T has virtual bases, + // probably likewise for compilers that use the same ABI: + struct unique{}; + virtual void unique_name_to_boost5487629(unique*); +# endif + char padding[256]; + private: + // keep some picky compilers happy: + d2(const d2&); + d2& operator=(const d2&); + }; +# endif + BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1))); +}; + +template <class T> +struct is_polymorphic_imp2 +{ + BOOST_STATIC_CONSTANT(bool, value = false); +}; + +template <bool is_class> +struct is_polymorphic_selector +{ + template <class T> + struct rebind + { + typedef is_polymorphic_imp2<T> type; + }; +}; + +template <> +struct is_polymorphic_selector<true> +{ + template <class T> + struct rebind + { + typedef is_polymorphic_imp1<T> type; + }; +}; + +template <class T> +struct is_polymorphic_imp +{ + typedef is_polymorphic_selector< ::boost::is_class<T>::value> selector; + typedef typename selector::template rebind<T> binder; + typedef typename binder::type imp_type; + BOOST_STATIC_CONSTANT(bool, value = imp_type::value); +}; + +} // namespace detail + +BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,::boost::detail::is_polymorphic_imp<T>::value) + +#else // BOOST_IS_POLYMORPHIC + +BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,BOOST_IS_POLYMORPHIC(T)) + +#endif + +} // namespace boost + +#include <boost/type_traits/detail/bool_trait_undef.hpp> + +#endif |