1 2 // (C) Copyright John Maddock & Thorsten Ottosen 2005. 3 // Use, modification and distribution are subject to the 4 // Boost Software License, Version 1.0. (See accompanying file 5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 7 #include "test.hpp" 8 #include "check_integral_constant.hpp" 9 #ifdef TEST_STD 10 # include <type_traits> 11 #else 12 # include <boost/type_traits/decay.hpp> 13 # include <boost/type_traits/is_same.hpp> 14 #endif 15 #include <iostream> 16 #include <string> 17 #include <utility> 18 19 #ifdef BOOST_INTEL 20 // remark #383: value copied to temporary, reference to temporary used 21 // std::pair<std::string, int> p2 = boost::make_pair( "foo", 1 ); 22 // ^ 23 #pragma warning(disable:383) 24 #endif 25 26 namespace boost 27 { 28 proc1()29 int proc1() 30 { 31 return 0; 32 } proc2(int c)33 int proc2(int c) 34 { 35 return c; 36 } 37 38 // 39 // An almost optimal version of std::make_pair() 40 // 41 template< class F, class S > 42 inline std::pair< BOOST_DEDUCED_TYPENAME tt::decay<const F>::type, 43 BOOST_DEDUCED_TYPENAME tt::decay<const S>::type > make_pair(const F & f,const S & s)44 make_pair( const F& f, const S& s ) 45 { 46 return std::pair< BOOST_DEDUCED_TYPENAME tt::decay<const F>::type, 47 BOOST_DEDUCED_TYPENAME tt::decay<const S>::type >( f, s ); 48 } 49 50 /* 51 This overload will mess up vc7.1 52 53 template< class F, class S > 54 inline std::pair< BOOST_DEDUCED_TYPENAME ::tt::decay<F>::type, 55 BOOST_DEDUCED_TYPENAME ::tt::decay<S>::type > 56 make_pair( F& f, S& s ) 57 { 58 return std::pair< BOOST_DEDUCED_TYPENAME ::tt::decay<F>::type, 59 BOOST_DEDUCED_TYPENAME ::tt::decay<S>::type >( f, s ); 60 } 61 */ 62 } 63 64 TT_TEST_BEGIN(is_class) 65 66 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 67 ::tt::decay<int>::type,int>::value), 68 true ); 69 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 70 ::tt::decay<char[2]>::type,char*>::value), 71 true ); 72 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 73 ::tt::decay<char[2][3]>::type,char(*)[3]>::value), 74 true ); 75 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 76 ::tt::decay<const char[2]>::type,const char*>::value), 77 true ); 78 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 79 ::tt::decay<wchar_t[2]>::type,wchar_t*>::value), 80 true ); 81 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 82 ::tt::decay<const wchar_t[2]>::type,const wchar_t*>::value), 83 true ); 84 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 85 ::tt::decay<const wchar_t[2]>::type,const wchar_t*>::value), 86 true ); 87 88 typedef int f1_type(void); 89 typedef int f2_type(int); 90 91 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 92 ::tt::decay<f1_type>::type,int (*)(void)>::value), 93 true ); 94 BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_same< 95 ::tt::decay<f2_type>::type,int (*)(int)>::value), 96 true ); 97 98 std::pair<std::string,std::string> p = boost::make_pair( "foo", "bar" ); 99 std::pair<std::string, int> p2 = boost::make_pair( "foo", 1 ); 100 #ifndef BOOST_NO_STD_WSTRING 101 std::pair<std::wstring,std::string> p3 = boost::make_pair( L"foo", "bar" ); 102 std::pair<std::wstring, int> p4 = boost::make_pair( L"foo", 1 ); 103 #endif 104 105 // 106 // Todo: make these work sometime. The test id not directly 107 // related to decay<T>::type and can be avoided for now. 108 // 109 /* 110 int array[10]; 111 std::pair<int*,int*> p5 = boost::make_pair( array, array ); 112 #ifndef __BORLANDC__ 113 std::pair<int(*)(void), int(*)(int)> p6 = boost::make_pair(boost::proc1, boost::proc2); 114 p6.first(); 115 p6.second(1); 116 #endif 117 */ 118 119 TT_TEST_END 120 121 122 123 124 125 126 127 128