1 #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED 2 #define BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED 3 4 // MS compatible compilers support #pragma once 5 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020) 7 # pragma once 8 #endif 9 10 // detail/sp_convertible.hpp 11 // 12 // Copyright 2008 Peter Dimov 13 // 14 // Distributed under the Boost Software License, Version 1.0. 15 // See accompanying file LICENSE_1_0.txt or copy at 16 // http://www.boost.org/LICENSE_1_0.txt 17 18 #include <boost/config.hpp> 19 #include <cstddef> 20 21 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE ) 22 # define BOOST_SP_NO_SP_CONVERTIBLE 23 #endif 24 25 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 ) 26 # define BOOST_SP_NO_SP_CONVERTIBLE 27 #endif 28 29 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 ) 30 # define BOOST_SP_NO_SP_CONVERTIBLE 31 #endif 32 33 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) 34 35 namespace boost 36 { 37 38 namespace detail 39 { 40 41 template< class Y, class T > struct sp_convertible 42 { 43 typedef char (&yes) [1]; 44 typedef char (&no) [2]; 45 46 static yes f( T* ); 47 static no f( ... ); 48 49 enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) }; 50 }; 51 52 template< class Y, class T > struct sp_convertible< Y, T[] > 53 { 54 enum _vt { value = false }; 55 }; 56 57 template< class Y, class T > struct sp_convertible< Y[], T[] > 58 { 59 enum _vt { value = sp_convertible< Y[1], T[1] >::value }; 60 }; 61 62 template< class Y, std::size_t N, class T > struct sp_convertible< Y[N], T[] > 63 { 64 enum _vt { value = sp_convertible< Y[1], T[1] >::value }; 65 }; 66 67 struct sp_empty 68 { 69 }; 70 71 template< bool > struct sp_enable_if_convertible_impl; 72 73 template<> struct sp_enable_if_convertible_impl<true> 74 { 75 typedef sp_empty type; 76 }; 77 78 template<> struct sp_enable_if_convertible_impl<false> 79 { 80 }; 81 82 template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_if_convertible_impl< sp_convertible< Y, T >::value > 83 { 84 }; 85 86 } // namespace detail 87 88 } // namespace boost 89 90 #endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE ) 91 92 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED 93