]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright Daniel Frey and Robert Ramey 2009. |
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_VIRTUAL_BASE_OF_HPP_INCLUDED | |
9 | #define BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED | |
10 | ||
11 | #include <boost/type_traits/is_base_of.hpp> | |
12 | #include <boost/type_traits/is_same.hpp> | |
13 | ||
14 | namespace boost { | |
15 | namespace detail { | |
16 | ||
17 | ||
18 | #ifdef BOOST_MSVC | |
19 | #pragma warning( push ) | |
20 | #pragma warning( disable : 4584 4250 4594) | |
21 | #elif defined(__GNUC__) && (__GNUC__ >= 4) | |
22 | #pragma GCC system_header | |
23 | #endif | |
24 | ||
25 | template<typename Base, typename Derived, typename tag> | |
26 | struct is_virtual_base_of_impl | |
27 | { | |
28 | BOOST_STATIC_CONSTANT(bool, value = false); | |
29 | }; | |
30 | ||
31 | template<typename Base, typename Derived> | |
32 | struct is_virtual_base_of_impl<Base, Derived, true_type> | |
33 | { | |
34 | union max_align | |
35 | { | |
36 | unsigned u; | |
37 | unsigned long ul; | |
38 | void* v; | |
39 | double d; | |
40 | long double ld; | |
41 | #ifndef BOOST_NO_LONG_LONG | |
42 | long long ll; | |
43 | #endif | |
44 | }; | |
45 | #ifdef __BORLANDC__ | |
46 | struct boost_type_traits_internal_struct_X : public virtual Derived, public virtual Base | |
47 | { | |
48 | boost_type_traits_internal_struct_X(); | |
49 | boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&); | |
50 | boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&); | |
51 | ~boost_type_traits_internal_struct_X()throw(); | |
52 | max_align data[4]; | |
53 | }; | |
54 | struct boost_type_traits_internal_struct_Y : public virtual Derived | |
55 | { | |
56 | boost_type_traits_internal_struct_Y(); | |
57 | boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&); | |
58 | boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&); | |
59 | ~boost_type_traits_internal_struct_Y()throw(); | |
60 | max_align data[4]; | |
61 | }; | |
62 | #else | |
63 | struct boost_type_traits_internal_struct_X : public Derived, virtual Base | |
64 | { | |
65 | boost_type_traits_internal_struct_X(); | |
66 | boost_type_traits_internal_struct_X(const boost_type_traits_internal_struct_X&); | |
67 | boost_type_traits_internal_struct_X& operator=(const boost_type_traits_internal_struct_X&); | |
68 | ~boost_type_traits_internal_struct_X()throw(); | |
69 | max_align data[16]; | |
70 | }; | |
71 | struct boost_type_traits_internal_struct_Y : public Derived | |
72 | { | |
73 | boost_type_traits_internal_struct_Y(); | |
74 | boost_type_traits_internal_struct_Y(const boost_type_traits_internal_struct_Y&); | |
75 | boost_type_traits_internal_struct_Y& operator=(const boost_type_traits_internal_struct_Y&); | |
76 | ~boost_type_traits_internal_struct_Y()throw(); | |
77 | max_align data[16]; | |
78 | }; | |
79 | #endif | |
80 | BOOST_STATIC_CONSTANT(bool, value = (sizeof(boost_type_traits_internal_struct_X)==sizeof(boost_type_traits_internal_struct_Y))); | |
81 | }; | |
82 | ||
83 | template<typename Base, typename Derived> | |
84 | struct is_virtual_base_of_impl2 | |
85 | { | |
86 | typedef boost::integral_constant<bool, (boost::is_base_of<Base, Derived>::value && ! boost::is_same<Base, Derived>::value)> tag_type; | |
87 | typedef is_virtual_base_of_impl<Base, Derived, tag_type> imp; | |
88 | BOOST_STATIC_CONSTANT(bool, value = imp::value); | |
89 | }; | |
90 | ||
91 | #ifdef BOOST_MSVC | |
92 | #pragma warning( pop ) | |
93 | #endif | |
94 | ||
95 | } // namespace detail | |
96 | ||
97 | template <class Base, class Derived> struct is_virtual_base_of : public integral_constant<bool, (::boost::detail::is_virtual_base_of_impl2<Base, Derived>::value)>{}; | |
98 | ||
99 | template <class Base, class Derived> struct is_virtual_base_of<Base&, Derived> : public false_type{}; | |
100 | template <class Base, class Derived> struct is_virtual_base_of<Base, Derived&> : public false_type{}; | |
101 | template <class Base, class Derived> struct is_virtual_base_of<Base&, Derived&> : public false_type{}; | |
102 | ||
103 | } // namespace boost | |
104 | ||
105 | #endif |