fixing stuff
[dyninst.git] / dynutil / h / dyn_detail / boost / type_traits / is_enum.hpp
1
2 //  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
3 //  Hinnant & John Maddock 2000.  
4 //  Use, modification and distribution are subject to the Boost Software License,
5 //  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt).
7 //
8 //  See http://www.boost.org/libs/type_traits for most recent version including documentation.
9
10
11 #ifndef DYN_DETAIL_BOOST_TT_IS_ENUM_HPP_INCLUDED
12 #define DYN_DETAIL_BOOST_TT_IS_ENUM_HPP_INCLUDED
13
14 #include <dyn_detail/boost/type_traits/intrinsics.hpp>
15 #ifndef DYN_DETAIL_BOOST_IS_ENUM
16 #include <dyn_detail/boost/type_traits/add_reference.hpp>
17 #include <dyn_detail/boost/type_traits/is_arithmetic.hpp>
18 #include <dyn_detail/boost/type_traits/is_reference.hpp>
19 #include <dyn_detail/boost/type_traits/is_convertible.hpp>
20 #include <dyn_detail/boost/type_traits/is_array.hpp>
21 #ifdef __GNUC__
22 #include <dyn_detail/boost/type_traits/is_function.hpp>
23 #endif
24 #include <dyn_detail/boost/type_traits/config.hpp>
25 #if defined(DYN_DETAIL_BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) 
26 #  include <dyn_detail/boost/type_traits/is_class.hpp>
27 #  include <dyn_detail/boost/type_traits/is_union.hpp>
28 #endif
29 #endif
30
31 // should be the last #include
32 #include <dyn_detail/boost/type_traits/detail/bool_trait_def.hpp>
33
34 namespace dyn_detail {
35 namespace boost {
36
37 #ifndef DYN_DETAIL_BOOST_IS_ENUM
38 #if !(defined(__BORLANDC__) && (__BORLANDC__ <= 0x551))
39
40 namespace detail {
41
42 #if defined(DYN_DETAIL_BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) 
43
44 template <typename T>
45 struct is_class_or_union
46 {
47    DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, value =
48       (::dyn_detail::boost::type_traits::ice_or<
49            ::dyn_detail::boost::is_class<T>::value
50          , ::dyn_detail::boost::is_union<T>::value
51       >::value));
52 };
53
54 #else
55
56 template <typename T>
57 struct is_class_or_union
58 {
59 # if DYN_DETAIL_BOOST_WORKAROUND(DYN_DETAIL_BOOST_MSVC, < 1300) || DYN_DETAIL_BOOST_WORKAROUND(__BORLANDC__, DYN_DETAIL_BOOST_TESTED_AT(0x581))// we simply can't detect it this way.
60     DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, value = false);
61 # else
62     template <class U> static ::dyn_detail::boost::type_traits::yes_type is_class_or_union_tester(void(U::*)(void));
63
64 #  if DYN_DETAIL_BOOST_WORKAROUND(DYN_DETAIL_BOOST_MSVC, == 1300)                 \
65     || DYN_DETAIL_BOOST_WORKAROUND(__MWERKS__, <= 0x3000) // no SFINAE
66     static ::dyn_detail::boost::type_traits::no_type is_class_or_union_tester(...);
67     DYN_DETAIL_BOOST_STATIC_CONSTANT(
68         bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::dyn_detail::boost::type_traits::yes_type));
69 #  else
70     template <class U>
71     static ::dyn_detail::boost::type_traits::no_type is_class_or_union_tester(...);
72     DYN_DETAIL_BOOST_STATIC_CONSTANT(
73         bool, value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(::dyn_detail::boost::type_traits::yes_type));
74 #  endif
75 # endif
76 };
77 #endif
78
79 struct int_convertible
80 {
81     int_convertible(int);
82 };
83
84 // Don't evaluate convertibility to int_convertible unless the type
85 // is non-arithmetic. This suppresses warnings with GCC.
86 template <bool is_typename_arithmetic_or_reference = true>
87 struct is_enum_helper
88 {
89     template <typename T> struct type
90     {
91         DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, value = false);
92     };
93 };
94
95 template <>
96 struct is_enum_helper<false>
97 {
98     template <typename T> struct type
99        : ::dyn_detail::boost::is_convertible<typename ::dyn_detail::boost::add_reference<T>::type,::dyn_detail::boost::detail::int_convertible>
100     {
101     };
102 };
103
104 template <typename T> struct is_enum_impl
105 {
106    //typedef ::boost::add_reference<T> ar_t;
107    //typedef typename ar_t::type r_type;
108
109 #if defined(__GNUC__)
110
111 #ifdef DYN_DETAIL_BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
112     
113    // We MUST check for is_class_or_union on conforming compilers in
114    // order to correctly deduce that noncopyable types are not enums
115    // (dwa 2002/04/15)...
116    DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, selector =
117       (::dyn_detail::boost::type_traits::ice_or<
118            ::dyn_detail::boost::is_arithmetic<T>::value
119          , ::dyn_detail::boost::is_reference<T>::value
120          , ::dyn_detail::boost::is_function<T>::value
121          , is_class_or_union<T>::value
122          , is_array<T>::value
123       >::value));
124 #else
125    // ...however, not checking is_class_or_union on non-conforming
126    // compilers prevents a dependency recursion.
127    DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, selector =
128       (::dyn_detail::boost::type_traits::ice_or<
129            ::dyn_detail::boost::is_arithmetic<T>::value
130          , ::dyn_detail::boost::is_reference<T>::value
131          , ::dyn_detail::boost::is_function<T>::value
132          , is_array<T>::value
133       >::value));
134 #endif // DYN_DETAIL_BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
135
136 #else // !defined(__GNUC__):
137     
138    DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, selector =
139       (::dyn_detail::boost::type_traits::ice_or<
140            ::dyn_detail::boost::is_arithmetic<T>::value
141          , ::dyn_detail::boost::is_reference<T>::value
142          , is_class_or_union<T>::value
143          , is_array<T>::value
144       >::value));
145     
146 #endif
147
148 #if DYN_DETAIL_BOOST_WORKAROUND(__BORLANDC__, < 0x600)
149    typedef ::dyn_detail::boost::detail::is_enum_helper<
150           ::dyn_detail::boost::detail::is_enum_impl<T>::selector
151         > se_t;
152 #else
153    typedef ::dyn_detail::boost::detail::is_enum_helper<selector> se_t;
154 #endif
155
156     typedef typename se_t::template type<T> helper;
157     DYN_DETAIL_BOOST_STATIC_CONSTANT(bool, value = helper::value);
158 };
159
160 // these help on compilers with no partial specialization support:
161 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void,false)
162 #ifndef DYN_DETAIL_BOOST_NO_CV_VOID_SPECIALIZATIONS
163 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const,false)
164 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void volatile,false)
165 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const volatile,false)
166 #endif
167
168 } // namespace detail
169
170 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,::dyn_detail::boost::detail::is_enum_impl<T>::value)
171
172 #else // __BORLANDC__
173 //
174 // buggy is_convertible prevents working
175 // implementation of is_enum:
176 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,false)
177
178 #endif
179
180 #else // DYN_DETAIL_BOOST_IS_ENUM
181
182 DYN_DETAIL_BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,DYN_DETAIL_BOOST_IS_ENUM(T))
183
184 #endif
185
186 } // namespace boost
187 } // namespace dyn_detail
188
189 #include <dyn_detail/boost/type_traits/detail/bool_trait_undef.hpp>
190
191 #endif // DYN_DETAIL_BOOST_TT_IS_ENUM_HPP_INCLUDED