1 | // (C) Copyright John Maddock 2000.
|
---|
2 | // Use, modification and distribution are subject to the Boost Software License,
|
---|
3 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
---|
4 | // http://www.boost.org/LICENSE_1_0.txt).
|
---|
5 | //
|
---|
6 | // See http://www.boost.org/libs/type_traits for most recent version including documentation.
|
---|
7 |
|
---|
8 | #ifndef BOOST_TT_IS_POLYMORPHIC_HPP
|
---|
9 | #define BOOST_TT_IS_POLYMORPHIC_HPP
|
---|
10 |
|
---|
11 | #include <boost/type_traits/is_class.hpp>
|
---|
12 | #include <boost/type_traits/remove_cv.hpp>
|
---|
13 | // should be the last #include
|
---|
14 | #include "boost/type_traits/detail/bool_trait_def.hpp"
|
---|
15 | #include <boost/detail/workaround.hpp>
|
---|
16 |
|
---|
17 | namespace boost{
|
---|
18 | namespace detail{
|
---|
19 |
|
---|
20 | template <class T>
|
---|
21 | struct is_polymorphic_imp1
|
---|
22 | {
|
---|
23 | # if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always.
|
---|
24 | typedef char d1, (&d2)[2];
|
---|
25 | # else
|
---|
26 | typedef typename remove_cv<T>::type ncvT;
|
---|
27 | struct d1 : public ncvT
|
---|
28 | {
|
---|
29 | d1();
|
---|
30 | # if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC
|
---|
31 | ~d1()throw();
|
---|
32 | # endif
|
---|
33 | char padding[256];
|
---|
34 | };
|
---|
35 | struct d2 : public ncvT
|
---|
36 | {
|
---|
37 | d2();
|
---|
38 | virtual ~d2()throw();
|
---|
39 | # if !defined(BOOST_MSVC) && !defined(__ICL)
|
---|
40 | // for some reason this messes up VC++ when T has virtual bases,
|
---|
41 | // probably likewise for compilers that use the same ABI:
|
---|
42 | struct unique{};
|
---|
43 | virtual void unique_name_to_boost5487629(unique*);
|
---|
44 | # endif
|
---|
45 | char padding[256];
|
---|
46 | };
|
---|
47 | # endif
|
---|
48 | BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1)));
|
---|
49 | };
|
---|
50 |
|
---|
51 | template <class T>
|
---|
52 | struct is_polymorphic_imp2
|
---|
53 | {
|
---|
54 | BOOST_STATIC_CONSTANT(bool, value = false);
|
---|
55 | };
|
---|
56 |
|
---|
57 | template <bool is_class>
|
---|
58 | struct is_polymorphic_selector
|
---|
59 | {
|
---|
60 | template <class T>
|
---|
61 | struct rebind
|
---|
62 | {
|
---|
63 | typedef is_polymorphic_imp2<T> type;
|
---|
64 | };
|
---|
65 | };
|
---|
66 |
|
---|
67 | template <>
|
---|
68 | struct is_polymorphic_selector<true>
|
---|
69 | {
|
---|
70 | template <class T>
|
---|
71 | struct rebind
|
---|
72 | {
|
---|
73 | typedef is_polymorphic_imp1<T> type;
|
---|
74 | };
|
---|
75 | };
|
---|
76 |
|
---|
77 | template <class T>
|
---|
78 | struct is_polymorphic_imp
|
---|
79 | {
|
---|
80 | typedef is_polymorphic_selector< ::boost::is_class<T>::value> selector;
|
---|
81 | typedef typename selector::template rebind<T> binder;
|
---|
82 | typedef typename binder::type imp_type;
|
---|
83 | BOOST_STATIC_CONSTANT(bool, value = imp_type::value);
|
---|
84 | };
|
---|
85 |
|
---|
86 | } // namespace detail
|
---|
87 |
|
---|
88 | BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,::boost::detail::is_polymorphic_imp<T>::value)
|
---|
89 |
|
---|
90 | } // namespace boost
|
---|
91 |
|
---|
92 | #include "boost/type_traits/detail/bool_trait_undef.hpp"
|
---|
93 |
|
---|
94 | #endif
|
---|