From 406b57c444ceefa00d590cddf5f453585def22a5 Mon Sep 17 00:00:00 2001 From: John Maddock Date: Sat, 26 Oct 2002 11:35:02 +0000 Subject: [PATCH] Added is_polymorphic. [SVN r15985] --- include/boost/type_traits/is_polymorphic.hpp | 83 ++++++++++++++++++++ test/is_polymorphic_test.cpp | 52 ++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 include/boost/type_traits/is_polymorphic.hpp create mode 100644 test/is_polymorphic_test.cpp diff --git a/include/boost/type_traits/is_polymorphic.hpp b/include/boost/type_traits/is_polymorphic.hpp new file mode 100644 index 0000000..90f6f06 --- /dev/null +++ b/include/boost/type_traits/is_polymorphic.hpp @@ -0,0 +1,83 @@ +// (C) Copyright John Maddock 2000. Permission to copy, use, modify, sell and +// distribute this software is granted provided this copyright notice appears +// in all copies. This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. + +#ifndef BOOST_TT_IS_POLYMORPHIC_HPP +#define BOOST_TT_IS_POLYMORPHIC_HPP + +#include +// should be the last #include +#include "boost/type_traits/detail/bool_trait_def.hpp" + +namespace boost{ +namespace detail{ + +template +struct is_polymorphic_imp1 +{ + struct d1 : public T + { + d1(); + ~d1(); + char padding[256]; + }; + struct d2 : public T + { + d2(); + virtual ~d2(); +#ifndef BOOST_MSVC + // for some reason this messes up VC++ when T has virtual bases: + virtual void foo(); +#endif + char padding[256]; + }; + BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1))); +}; + +template +struct is_polymorphic_imp2 +{ + BOOST_STATIC_CONSTANT(bool, value = false); +}; + +template +struct is_polymorphic_selector +{ + template + struct rebind + { + typedef is_polymorphic_imp2 type; + }; +}; + +template <> +struct is_polymorphic_selector +{ + template + struct rebind + { + typedef is_polymorphic_imp1 type; + }; +}; + +template +struct is_polymorphic_imp +{ + typedef is_polymorphic_selector< ::boost::is_class::value> selector; + typedef typename selector::template rebind 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::value) + +} // namespace boost + +#include "boost/type_traits/detail/bool_trait_undef.hpp" + +#endif + + diff --git a/test/is_polymorphic_test.cpp b/test/is_polymorphic_test.cpp new file mode 100644 index 0000000..8f5e089 --- /dev/null +++ b/test/is_polymorphic_test.cpp @@ -0,0 +1,52 @@ + +// (C) Copyright John Maddock 2000. Permission to copy, use, modify, sell and +// distribute this software is granted provided this copyright notice appears +// in all copies. This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. + +#include "test.hpp" +#include "check_integral_constant.hpp" +#include TYPE_TRAITS(is_polymorphic) + +TT_TEST_BEGIN(is_polymorphic) + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic >::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic >::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_polymorphic >::value, true); + +TT_TEST_END + + + + + + + +