1
2// (C) Copyright Runar Undheim, Robert Ramey & John Maddock 2008.
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt).
6//
7// See http://www.boost.org/libs/type_traits for most recent version including documentation.
8
9#ifndef BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
10#define BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
11
12#include <new> // std::nothrow_t
13#include <cstddef> // std::size_t
14#include <boost/type_traits/integral_constant.hpp>
15#include <boost/type_traits/detail/yes_no_type.hpp>
16#include <boost/detail/workaround.hpp>
17
18#if defined(new)
19# if BOOST_WORKAROUND(BOOST_MSVC, >= 1310)
20# define BOOST_TT_AUX_MACRO_NEW_DEFINED
21# pragma push_macro("new")
22# undef new
23# else
24# error "Sorry but you can't include this header if 'new' is defined as a macro."
25# endif
26#endif
27
28namespace boost {
29namespace detail {
30 template <class U, U x>
31 struct test;
32
33 template <typename T>
34 struct has_new_operator_impl {
35 template<class U>
36 static type_traits::yes_type check_sig1(
37 U*,
38 test<
39 void *(*)(std::size_t),
40 &U::operator new
41 >* = NULL
42 );
43 template<class U>
44 static type_traits::no_type check_sig1(...);
45
46 template<class U>
47 static type_traits::yes_type check_sig2(
48 U*,
49 test<
50 void *(*)(std::size_t, const std::nothrow_t&),
51 &U::operator new
52 >* = NULL
53 );
54 template<class U>
55 static type_traits::no_type check_sig2(...);
56
57 template<class U>
58 static type_traits::yes_type check_sig3(
59 U*,
60 test<
61 void *(*)(std::size_t, void*),
62 &U::operator new
63 >* = NULL
64 );
65 template<class U>
66 static type_traits::no_type check_sig3(...);
67
68
69 template<class U>
70 static type_traits::yes_type check_sig4(
71 U*,
72 test<
73 void *(*)(std::size_t),
74 &U::operator new[]
75 >* = NULL
76 );
77 template<class U>
78 static type_traits::no_type check_sig4(...);
79
80 template<class U>
81 static type_traits::yes_type check_sig5(
82 U*,
83 test<
84 void *(*)(std::size_t, const std::nothrow_t&),
85 &U::operator new[]
86 >* = NULL
87 );
88 template<class U>
89 static type_traits::no_type check_sig5(...);
90
91 template<class U>
92 static type_traits::yes_type check_sig6(
93 U*,
94 test<
95 void *(*)(std::size_t, void*),
96 &U::operator new[]
97 >* = NULL
98 );
99 template<class U>
100 static type_traits::no_type check_sig6(...);
101
102 // GCC2 won't even parse this template if we embed the computation
103 // of s1 in the computation of value.
104 #ifdef __GNUC__
105 BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl<T>::template check_sig1<T>(0)));
106 BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(has_new_operator_impl<T>::template check_sig2<T>(0)));
107 BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(has_new_operator_impl<T>::template check_sig3<T>(0)));
108 BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(has_new_operator_impl<T>::template check_sig4<T>(0)));
109 BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(has_new_operator_impl<T>::template check_sig5<T>(0)));
110 BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(has_new_operator_impl<T>::template check_sig6<T>(0)));
111 #else
112 #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
113 #pragma warning(push)
114 #pragma warning(disable:6334)
115 #endif
116
117 BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig1<T>(0)));
118 BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(check_sig2<T>(0)));
119 BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(check_sig3<T>(0)));
120 BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(check_sig4<T>(0)));
121 BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(check_sig5<T>(0)));
122 BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(check_sig6<T>(0)));
123
124 #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
125 #pragma warning(pop)
126 #endif
127 #endif
128 BOOST_STATIC_CONSTANT(bool, value =
129 (s1 == sizeof(type_traits::yes_type)) ||
130 (s2 == sizeof(type_traits::yes_type)) ||
131 (s3 == sizeof(type_traits::yes_type)) ||
132 (s4 == sizeof(type_traits::yes_type)) ||
133 (s5 == sizeof(type_traits::yes_type)) ||
134 (s6 == sizeof(type_traits::yes_type))
135 );
136 };
137} // namespace detail
138
139template <class T> struct has_new_operator : public integral_constant<bool, ::boost::detail::has_new_operator_impl<T>::value>{};
140
141} // namespace boost
142
143#if defined(BOOST_TT_AUX_MACRO_NEW_DEFINED)
144# pragma pop_macro("new")
145#endif
146
147#endif // BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
148

source code of boost/boost/type_traits/has_new_operator.hpp