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 20 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE ) 21 # define BOOST_SP_NO_SP_CONVERTIBLE 22 #endif 23 24 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 ) 25 # define BOOST_SP_NO_SP_CONVERTIBLE 26 #endif 27 28 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 ) 29 # define BOOST_SP_NO_SP_CONVERTIBLE 30 #endif 31 32 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) 33 34 namespace boost 35 { 36 37 namespace detail 38 { 39 40 template< class Y, class T > struct sp_convertible 41 { 42 typedef char (&yes) [1]; 43 typedef char (&no) [2]; 44 45 static yes f( T* ); 46 static no f( ... ); 47 48 enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) }; 49 }; 50 51 struct sp_empty 52 { 53 }; 54 55 template< bool > struct sp_enable_if_convertible_impl; 56 57 template<> struct sp_enable_if_convertible_impl<true> 58 { 59 typedef sp_empty type; 60 }; 61 62 template<> struct sp_enable_if_convertible_impl<false> 63 { 64 }; 65 66 template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_if_convertible_impl< sp_convertible< Y, T >::value > 67 { 68 }; 69 70 } // namespace detail 71 72 } // namespace boost 73 74 #endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE ) 75 76 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED 77