12 #ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
13 #define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
17 #ifndef BOOST_IS_CONVERTIBLE
23 #if !defined(BOOST_NO_IS_ABSTRACT)
30 #if defined(__MWERKS__)
33 #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
36 #elif defined(BOOST_MSVC) || defined(BOOST_INTEL)
39 #endif // BOOST_IS_CONVERTIBLE
43 #ifndef BOOST_IS_CONVERTIBLE
57 #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !(defined(BOOST_GCC) && (BOOST_GCC < 40700))
61 # define BOOST_TT_CXX11_IS_CONVERTIBLE
63 template <
class A,
class B,
class C>
66 static const bool value = (A::value || B::value || C::value);
69 template<
typename From,
typename To,
bool b = or_helper<boost::is_
void<From>, boost::is_function<To>, boost::is_array<To> >::value>
76 template<
typename From,
typename To>
82 template<
typename To1>
83 static void test_aux(To1);
85 template<
typename From1,
typename To1>
86 static decltype(test_aux<To1>(boost::declval<From1>()),
one())
test(
int);
88 template<typename, typename>
92 static const
bool value = sizeof(
test<From, To>(0)) == 1;
95 #elif defined(__BORLANDC__) && (__BORLANDC__ < 0x560)
101 template <
typename From,
typename To>
104 #pragma option push -w-8074
107 template <
typename T>
struct checker
109 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(...);
114 static bool const value =
sizeof( checker<To>::_m_check(_m_from) )
119 #elif defined(__GNUC__) || defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
123 struct any_conversion
125 template <
typename T> any_conversion(
const volatile T&);
126 template <
typename T> any_conversion(
const T&);
127 template <
typename T> any_conversion(
volatile T&);
128 template <
typename T> any_conversion(
T&);
131 template <
typename T>
struct checker
137 template <
typename From,
typename To>
138 struct is_convertible_basic_impl
142 static lvalue_type _m_from;
143 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6)))
144 static bool const value =
145 sizeof( boost::detail::checker<To>::_m_check(
static_cast<rvalue_type
>(_m_from), 0) )
148 static bool const value =
149 sizeof( boost::detail::checker<To>::_m_check(_m_from, 0) )
154 #elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \
155 || defined(__IBMCPP__) || defined(__HP_aCC)
166 struct any_conversion
168 template <
typename T> any_conversion(
const volatile T&);
169 template <
typename T> any_conversion(
const T&);
170 template <
typename T> any_conversion(
volatile T&);
173 template <
typename T> any_conversion(
T&);
176 template <
typename From,
typename To>
177 struct is_convertible_basic_impl
179 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(any_conversion ...);
183 static lvalue_type _m_from;
185 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
196 #elif defined(__DMC__)
198 struct any_conversion
200 template <
typename T> any_conversion(
const volatile T&);
201 template <
typename T> any_conversion(
const T&);
202 template <
typename T> any_conversion(
volatile T&);
205 template <
typename T> any_conversion(
T&);
208 template <
typename From,
typename To>
209 struct is_convertible_basic_impl
213 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(any_conversion,
float,
T);
217 static lvalue_type _m_from;
221 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
232 #elif defined(__MWERKS__)
240 template <
typename From,
typename To,
bool FromIsFunctionRef>
241 struct is_convertible_basic_impl_aux;
243 struct any_conversion
245 template <
typename T> any_conversion(
const volatile T&);
246 template <
typename T> any_conversion(
const T&);
247 template <
typename T> any_conversion(
volatile T&);
248 template <
typename T> any_conversion(
T&);
251 template <
typename From,
typename To>
252 struct is_convertible_basic_impl_aux<From,To,false >
254 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(any_conversion ...);
258 static lvalue_type _m_from;
260 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
271 template <
typename From,
typename To>
272 struct is_convertible_basic_impl_aux<From,To,true >
274 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(...);
278 static lvalue_type _m_from;
279 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
290 template <
typename From,
typename To>
291 struct is_convertible_basic_impl:
292 is_convertible_basic_impl_aux<
294 ::boost::is_function<typename ::boost::remove_reference<From>::type>::value
306 template <
typename From>
307 struct is_convertible_basic_impl_add_lvalue_reference
308 : add_lvalue_reference<From>
311 template <
typename From>
312 struct is_convertible_basic_impl_add_lvalue_reference<From[]>
314 typedef From type [];
317 template <
typename From,
typename To>
318 struct is_convertible_basic_impl
320 static ::boost::type_traits::no_type
BOOST_TT_DECL _m_check(...);
322 typedef typename is_convertible_basic_impl_add_lvalue_reference<From>::type lvalue_type;
323 static lvalue_type _m_from;
325 #pragma warning(push)
326 #pragma warning(disable:4244)
327 #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
328 #pragma warning(disable:6334)
331 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
346 #endif // is_convertible_impl
350 template <
typename From,
typename To>
351 struct is_convertible_impl
357 #elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551
358 template <
typename From,
typename To>
365 template <
bool trivial1,
bool trivial2,
bool abstract_target>
368 template <
class From,
class To>
378 template <
class From,
class To>
388 template <
class From,
class To>
398 template <
class From,
class To>
405 template <
typename From,
typename To>
408 #if !BOOST_WORKAROUND(__HP_aCC, < 60700)
412 #if !defined(BOOST_NO_IS_ABSTRACT) && !defined(BOOST_TT_CXX11_IS_CONVERTIBLE)
422 typedef typename selector::template rebind<From, To>
isc_binder;
423 typedef typename isc_binder::type
type;
426 template <
typename From,
typename To>
436 #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
460 #endif // BOOST_NO_CV_VOID_SPECIALIZATIONS
465 #ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
476 template <
class From,
class To>
481 template <
class From,
class To>
488 #endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED