1 #include <algorithm> 2 #include <vector> 3 #include <string> 4 5 #include "cppunit/cppunit_proxy.h" 6 7 #if defined (_STLP_USE_NAMESPACES) 8 using namespace std; 9 #endif 10 11 // 12 // TestCase class 13 // 14 class TypeTraitsTest : public CPPUNIT_NS::TestCase 15 { 16 CPPUNIT_TEST_SUITE(TypeTraitsTest); 17 #if !defined (STLPORT) 18 CPPUNIT_IGNORE; 19 #endif 20 CPPUNIT_TEST(manips); 21 CPPUNIT_TEST(integer); 22 CPPUNIT_TEST(rational); 23 CPPUNIT_TEST(pointer_type); 24 #if defined (STLPORT) && !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 25 CPPUNIT_IGNORE; 26 #endif 27 CPPUNIT_TEST(reference_type); 28 #if defined (STLPORT) 29 CPPUNIT_STOP_IGNORE; 30 #endif 31 CPPUNIT_TEST(both_pointer_type); 32 CPPUNIT_TEST(ok_to_use_memcpy); 33 CPPUNIT_TEST(ok_to_use_memmove); 34 CPPUNIT_TEST(trivial_destructor); 35 CPPUNIT_TEST(is_POD); 36 CPPUNIT_TEST(stlport_class); 37 CPPUNIT_TEST_SUITE_END(); 38 39 protected: 40 void manips(); 41 void integer(); 42 void rational(); 43 void pointer_type(); 44 void reference_type(); 45 void both_pointer_type(); 46 void ok_to_use_memcpy(); 47 void ok_to_use_memmove(); 48 void trivial_destructor(); 49 void is_POD(); 50 void stlport_class(); 51 }; 52 53 CPPUNIT_TEST_SUITE_REGISTRATION(TypeTraitsTest); 54 55 #if defined (STLPORT) 56 57 # if defined (__GNUC__) && defined (_STLP_USE_NAMESPACES) 58 // libstdc++ sometimes exposed its own __true_type type in global 59 // namespace resulting in an ambiguity. 60 # define __true_type std::__true_type 61 # define __false_type std::__false_type 62 # endif 63 64 int type_to_value(__true_type) 65 { return 1; } 66 int type_to_value(__false_type) 67 { return 0; } 68 69 int* int_pointer; 70 int const* int_const_pointer; 71 int volatile* int_volatile_pointer; 72 int const volatile* int_const_volatile_pointer; 73 int int_val = 0; 74 int const int_const_val = 0; 75 int volatile int_volatile_val = 0; 76 int & int_ref = int_val; 77 int const& int_const_ref = int_val; 78 int const volatile& int_const_volatile_ref = int_val; 79 80 //A type that represent any type: 81 struct any_type 82 { 83 //Dummy operations to forbid to compilers with intrinsic 84 //type traits support to consider this type as a POD. 85 any_type() : m_data(1) {} 86 any_type(const any_type&) : m_data(2) {} 87 any_type& operator = (const any_type&) 88 { m_data = 3; return *this; } 89 ~any_type() { m_data = 0; } 90 91 size_t m_data; 92 }; 93 94 any_type any; 95 any_type* any_pointer; 96 any_type const* any_const_pointer; 97 any_type volatile* any_volatile_pointer; 98 any_type const volatile* any_const_volatile_pointer; 99 100 //A type that represent any pod type 101 struct any_pod_type 102 {}; 103 104 # if defined (_STLP_USE_BOOST_SUPPORT) 105 //Mandatory for compilers without without partial template specialization. 106 BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(any_pod_type) 107 # endif 108 109 any_pod_type any_pod; 110 any_pod_type* any_pod_pointer; 111 any_pod_type const* any_pod_const_pointer; 112 any_pod_type volatile* any_pod_volatile_pointer; 113 any_pod_type const volatile* any_pod_const_volatile_pointer; 114 115 # if defined (_STLP_USE_NAMESPACES) 116 namespace std { 117 # endif 118 _STLP_TEMPLATE_NULL 119 struct __type_traits<any_pod_type> { 120 typedef __true_type has_trivial_default_constructor; 121 typedef __true_type has_trivial_copy_constructor; 122 typedef __true_type has_trivial_assignment_operator; 123 typedef __true_type has_trivial_destructor; 124 typedef __true_type is_POD_type; 125 }; 126 # if defined (_STLP_USE_NAMESPACES) 127 } 128 # endif 129 130 struct base 131 {}; 132 struct derived : public base 133 {}; 134 135 // 136 // tests implementation 137 // 138 template <typename _Src, typename _Dst> 139 int is_convertible(_Src, _Dst) { 140 # if !defined(__BORLANDC__) 141 typedef typename _IsConvertible<_Src, _Dst>::_Ret _Ret; 142 # else 143 enum { _Is = _IsConvertible<_Src, _Dst>::value }; 144 typedef typename __bool2type<_Is>::_Ret _Ret; 145 # endif 146 return type_to_value(_Ret()); 147 } 148 149 template <typename _Src, typename _Dst> 150 int is_cv_convertible(_Src, _Dst) { 151 # if !defined(__BORLANDC__) 152 typedef typename _IsCVConvertible<_Src, _Dst>::_Ret _Ret; 153 # else 154 enum { _Is = _IsCVConvertible<_Src, _Dst>::value }; 155 typedef typename __bool2type<_Is>::_Ret _Ret; 156 # endif 157 return type_to_value(_Ret()); 158 } 159 #endif 160 161 void TypeTraitsTest::manips() 162 { 163 #if defined (STLPORT) 164 { 165 typedef __bool2type<0>::_Ret _ZeroRet; 166 CPPUNIT_ASSERT( type_to_value(_ZeroRet()) == 0 ); 167 typedef __bool2type<1>::_Ret _OneRet; 168 CPPUNIT_ASSERT( type_to_value(_OneRet()) == 1 ); 169 typedef __bool2type<65456873>::_Ret _AnyRet; 170 CPPUNIT_ASSERT( type_to_value(_AnyRet()) == 1 ); 171 } 172 173 { 174 CPPUNIT_ASSERT( __type2bool<__true_type>::_Ret == 1 ); 175 CPPUNIT_ASSERT( __type2bool<__false_type>::_Ret == 0 ); 176 CPPUNIT_ASSERT( __type2bool<any_type>::_Ret == 1 ); 177 } 178 179 { 180 typedef _Not<__true_type>::_Ret _NotTrueRet; 181 CPPUNIT_ASSERT( type_to_value(_NotTrueRet()) == 0 ); 182 typedef _Not<__false_type>::_Ret _NotFalseRet; 183 CPPUNIT_ASSERT( type_to_value(_NotFalseRet()) == 1 ); 184 } 185 186 { 187 typedef _Land2<__true_type, __true_type>::_Ret _TrueTrueRet; 188 CPPUNIT_ASSERT( type_to_value(_TrueTrueRet()) == 1 ); 189 typedef _Land2<__true_type, __false_type>::_Ret _TrueFalseRet; 190 CPPUNIT_ASSERT( type_to_value(_TrueFalseRet()) == 0 ); 191 typedef _Land2<__false_type, __true_type>::_Ret _FalseTrueRet; 192 CPPUNIT_ASSERT( type_to_value(_FalseTrueRet()) == 0 ); 193 typedef _Land2<__false_type, __false_type>::_Ret _FalseFalseRet; 194 CPPUNIT_ASSERT( type_to_value(_FalseFalseRet()) == 0 ); 195 } 196 197 { 198 typedef _Land3<__true_type, __true_type, __true_type>::_Ret _TrueTrueTrueRet; 199 CPPUNIT_ASSERT( type_to_value(_TrueTrueTrueRet()) == 1 ); 200 typedef _Land3<__true_type, __true_type, __false_type>::_Ret _TrueTrueFalseRet; 201 CPPUNIT_ASSERT( type_to_value(_TrueTrueFalseRet()) == 0 ); 202 typedef _Land3<__true_type, __false_type, __true_type>::_Ret _TrueFalseTrueRet; 203 CPPUNIT_ASSERT( type_to_value(_TrueFalseTrueRet()) == 0 ); 204 typedef _Land3<__true_type, __false_type, __false_type>::_Ret _TrueFalseFalseRet; 205 CPPUNIT_ASSERT( type_to_value(_TrueFalseFalseRet()) == 0 ); 206 typedef _Land3<__false_type, __true_type, __true_type>::_Ret _FalseTrueTrueRet; 207 CPPUNIT_ASSERT( type_to_value(_FalseTrueTrueRet()) == 0 ); 208 typedef _Land3<__false_type, __true_type, __false_type>::_Ret _FalseTrueFalseRet; 209 CPPUNIT_ASSERT( type_to_value(_FalseTrueFalseRet()) == 0 ); 210 typedef _Land3<__false_type, __false_type, __true_type>::_Ret _FalseFalseTrueRet; 211 CPPUNIT_ASSERT( type_to_value(_FalseFalseTrueRet()) == 0 ); 212 typedef _Land3<__false_type, __false_type, __false_type>::_Ret _FalseFalseFalseRet; 213 CPPUNIT_ASSERT( type_to_value(_FalseFalseFalseRet()) == 0 ); 214 } 215 216 { 217 typedef _Lor2<__true_type, __true_type>::_Ret _TrueTrueRet; 218 CPPUNIT_ASSERT( type_to_value(_TrueTrueRet()) == 1 ); 219 typedef _Lor2<__true_type, __false_type>::_Ret _TrueFalseRet; 220 CPPUNIT_ASSERT( type_to_value(_TrueFalseRet()) == 1 ); 221 typedef _Lor2<__false_type, __true_type>::_Ret _FalseTrueRet; 222 CPPUNIT_ASSERT( type_to_value(_FalseTrueRet()) == 1 ); 223 typedef _Lor2<__false_type, __false_type>::_Ret _FalseFalseRet; 224 CPPUNIT_ASSERT( type_to_value(_FalseFalseRet()) == 0 ); 225 } 226 227 { 228 typedef _Lor3<__true_type, __true_type, __true_type>::_Ret _TrueTrueTrueRet; 229 CPPUNIT_ASSERT( type_to_value(_TrueTrueTrueRet()) == 1 ); 230 typedef _Lor3<__true_type, __true_type, __false_type>::_Ret _TrueTrueFalseRet; 231 CPPUNIT_ASSERT( type_to_value(_TrueTrueFalseRet()) == 1 ); 232 typedef _Lor3<__true_type, __false_type, __true_type>::_Ret _TrueFalseTrueRet; 233 CPPUNIT_ASSERT( type_to_value(_TrueFalseTrueRet()) == 1 ); 234 typedef _Lor3<__true_type, __false_type, __false_type>::_Ret _TrueFalseFalseRet; 235 CPPUNIT_ASSERT( type_to_value(_TrueFalseFalseRet()) == 1 ); 236 typedef _Lor3<__false_type, __true_type, __true_type>::_Ret _FalseTrueTrueRet; 237 CPPUNIT_ASSERT( type_to_value(_FalseTrueTrueRet()) == 1 ); 238 typedef _Lor3<__false_type, __true_type, __false_type>::_Ret _FalseTrueFalseRet; 239 CPPUNIT_ASSERT( type_to_value(_FalseTrueFalseRet()) == 1 ); 240 typedef _Lor3<__false_type, __false_type, __true_type>::_Ret _FalseFalseTrueRet; 241 CPPUNIT_ASSERT( type_to_value(_FalseFalseTrueRet()) == 1 ); 242 typedef _Lor3<__false_type, __false_type, __false_type>::_Ret _FalseFalseFalseRet; 243 CPPUNIT_ASSERT( type_to_value(_FalseFalseFalseRet()) == 0 ); 244 } 245 246 { 247 typedef __select<1, __true_type, __false_type>::_Ret _SelectFirstRet; 248 CPPUNIT_ASSERT( type_to_value(_SelectFirstRet()) == 1 ); 249 typedef __select<0, __true_type, __false_type>::_Ret _SelectSecondRet; 250 CPPUNIT_ASSERT( type_to_value(_SelectSecondRet()) == 0 ); 251 # if defined (__BORLANDC__) 252 typedef __selectT<__true_type, __true_type, __false_type>::_Ret _SelectFirstRet; 253 CPPUNIT_ASSERT( type_to_value(_SelectFirstRet()) == 1 ); 254 typedef __selectT<__false_type, __true_type, __false_type>::_Ret _SelectSecondRet; 255 CPPUNIT_ASSERT( type_to_value(_SelectSecondRet()) == 0 ); 256 # endif 257 } 258 259 { 260 base b; 261 derived d; 262 const derived cd = d; 263 base *pb = &b; 264 derived *pd = &d; 265 derived const *pcd = pd; 266 CPPUNIT_CHECK( is_convertible(any, b) == 0 ); 267 CPPUNIT_CHECK( is_convertible(d, b) == 1 ); 268 CPPUNIT_CHECK( is_convertible(cd, b) == 1 ); 269 // _IsCVConvertible only needs to work for pointer type: 270 //CPPUNIT_CHECK( is_cv_convertible(d, b) == 1 ); 271 //CPPUNIT_CHECK( is_cv_convertible(cd, b) == 0 ); 272 273 //_IsConvertible do not need to work for pointers: 274 //CPPUNIT_CHECK( is_convertible(pd, pb) == 1 ); 275 //CPPUNIT_CHECK( is_convertible(pcd, pb) == 1 ); 276 277 CPPUNIT_CHECK( is_cv_convertible(pd, pb) == 1 ); 278 CPPUNIT_CHECK( is_cv_convertible(pcd, pb) == 0 ); 279 } 280 #endif 281 } 282 283 #if defined (STLPORT) 284 template <typename _Type> 285 int is_integer(_Type) { 286 typedef typename _IsIntegral<_Type>::_Ret _Ret; 287 return type_to_value(_Ret()); 288 } 289 #endif 290 291 void TypeTraitsTest::integer() 292 { 293 #if defined (STLPORT) 294 CPPUNIT_ASSERT( is_integer(bool()) == 1 ); 295 CPPUNIT_ASSERT( is_integer(char()) == 1 ); 296 typedef signed char signed_char; 297 CPPUNIT_ASSERT( is_integer(signed_char()) == 1 ); 298 typedef unsigned char unsigned_char; 299 CPPUNIT_ASSERT( is_integer(unsigned_char()) == 1 ); 300 # if defined (_STLP_HAS_WCHAR_T) 301 CPPUNIT_ASSERT( is_integer(wchar_t()) == 1 ); 302 # endif 303 CPPUNIT_ASSERT( is_integer(short()) == 1 ); 304 typedef unsigned short unsigned_short; 305 CPPUNIT_ASSERT( is_integer(unsigned_short()) == 1 ); 306 CPPUNIT_ASSERT( is_integer(int()) == 1 ); 307 typedef unsigned int unsigned_int; 308 CPPUNIT_ASSERT( is_integer(unsigned_int()) == 1 ); 309 CPPUNIT_ASSERT( is_integer(long()) == 1 ); 310 typedef unsigned long unsigned_long; 311 CPPUNIT_ASSERT( is_integer(unsigned_long()) == 1 ); 312 # if defined (_STLP_LONG_LONG) 313 typedef _STLP_LONG_LONG long_long; 314 CPPUNIT_ASSERT( is_integer(long_long()) == 1 ); 315 typedef unsigned _STLP_LONG_LONG unsigned_long_long; 316 CPPUNIT_ASSERT( is_integer(unsigned_long_long()) == 1 ); 317 # endif 318 CPPUNIT_ASSERT( is_integer(float()) == 0 ); 319 CPPUNIT_ASSERT( is_integer(double()) == 0 ); 320 # if !defined ( _STLP_NO_LONG_DOUBLE ) 321 typedef long double long_double; 322 CPPUNIT_ASSERT( is_integer(long_double()) == 0 ); 323 # endif 324 CPPUNIT_ASSERT( is_integer(any) == 0 ); 325 CPPUNIT_ASSERT( is_integer(any_pointer) == 0 ); 326 #endif 327 } 328 329 #if defined (STLPORT) 330 template <typename _Type> 331 int is_rational(_Type) { 332 typedef typename _IsRational<_Type>::_Ret _Ret; 333 return type_to_value(_Ret()); 334 } 335 #endif 336 337 void TypeTraitsTest::rational() 338 { 339 #if defined (STLPORT) 340 CPPUNIT_ASSERT( is_rational(bool()) == 0 ); 341 CPPUNIT_ASSERT( is_rational(char()) == 0 ); 342 typedef signed char signed_char; 343 CPPUNIT_ASSERT( is_rational(signed_char()) == 0 ); 344 typedef unsigned char unsigned_char; 345 CPPUNIT_ASSERT( is_rational(unsigned_char()) == 0 ); 346 # if defined (_STLP_HAS_WCHAR_T) 347 CPPUNIT_ASSERT( is_rational(wchar_t()) == 0 ); 348 # endif 349 CPPUNIT_ASSERT( is_rational(short()) == 0 ); 350 typedef unsigned short unsigned_short; 351 CPPUNIT_ASSERT( is_rational(unsigned_short()) == 0 ); 352 CPPUNIT_ASSERT( is_rational(int()) == 0 ); 353 typedef unsigned int unsigned_int; 354 CPPUNIT_ASSERT( is_rational(unsigned_int()) == 0 ); 355 CPPUNIT_ASSERT( is_rational(long()) == 0 ); 356 typedef unsigned long unsigned_long; 357 CPPUNIT_ASSERT( is_rational(unsigned_long()) == 0 ); 358 # if defined (_STLP_LONG_LONG) 359 typedef _STLP_LONG_LONG long_long; 360 CPPUNIT_ASSERT( is_rational(long_long()) == 0 ); 361 typedef unsigned _STLP_LONG_LONG unsigned_long_long; 362 CPPUNIT_ASSERT( is_rational(unsigned_long_long()) == 0 ); 363 # endif 364 CPPUNIT_ASSERT( is_rational(float()) == 1 ); 365 CPPUNIT_ASSERT( is_rational(double()) == 1 ); 366 # if !defined ( _STLP_NO_LONG_DOUBLE ) 367 typedef long double long_double; 368 CPPUNIT_ASSERT( is_rational(long_double()) == 1 ); 369 # endif 370 CPPUNIT_ASSERT( is_rational(any) == 0 ); 371 CPPUNIT_ASSERT( is_rational(any_pointer) == 0 ); 372 #endif 373 } 374 375 #if defined (STLPORT) 376 template <typename _Type> 377 int is_pointer_type(_Type) { 378 return type_to_value(_IsPtrType<_Type>::_Ret()); 379 } 380 #endif 381 382 void TypeTraitsTest::pointer_type() 383 { 384 #if defined (STLPORT) 385 CPPUNIT_ASSERT( is_pointer_type(int_val) == 0 ); 386 CPPUNIT_ASSERT( is_pointer_type(int_pointer) == 1 ); 387 CPPUNIT_ASSERT( is_pointer_type(int_const_pointer) == 1 ); 388 CPPUNIT_ASSERT( is_pointer_type(int_volatile_pointer) == 1 ); 389 CPPUNIT_ASSERT( is_pointer_type(int_const_volatile_pointer) == 1 ); 390 CPPUNIT_ASSERT( is_pointer_type(int_ref) == 0 ); 391 CPPUNIT_ASSERT( is_pointer_type(int_const_ref) == 0 ); 392 CPPUNIT_ASSERT( is_pointer_type(any) == 0 ); 393 CPPUNIT_ASSERT( is_pointer_type(any_pointer) == 1 ); 394 #endif 395 } 396 397 void TypeTraitsTest::reference_type() 398 { 399 #if defined (STLPORT) && defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 400 CPPUNIT_ASSERT( type_to_value(_IsRefType<int>::_Ret()) == 0 ); 401 CPPUNIT_ASSERT( type_to_value(_IsRefType<int*>::_Ret()) == 0 ); 402 CPPUNIT_ASSERT( type_to_value(_IsRefType<int&>::_Ret()) == 1 ); 403 CPPUNIT_ASSERT( type_to_value(_IsRefType<int const&>::_Ret()) == 1 ); 404 CPPUNIT_ASSERT( type_to_value(_IsRefType<int const volatile&>::_Ret()) == 1 ); 405 406 CPPUNIT_ASSERT( type_to_value(_IsOKToSwap(int_pointer, int_pointer, __true_type(), __true_type())._Answer()) == 1 ); 407 CPPUNIT_ASSERT( type_to_value(_IsOKToSwap(int_pointer, int_pointer, __false_type(), __false_type())._Answer()) == 0 ); 408 #endif 409 } 410 411 #if defined (STLPORT) 412 template <typename _Tp1, typename _Tp2> 413 int are_both_pointer_type (_Tp1, _Tp2) { 414 return type_to_value(_BothPtrType<_Tp1, _Tp2>::_Answer()); 415 } 416 #endif 417 418 void TypeTraitsTest::both_pointer_type() 419 { 420 #if defined (STLPORT) 421 CPPUNIT_CHECK( are_both_pointer_type(int_val, int_val) == 0 ); 422 CPPUNIT_CHECK( are_both_pointer_type(int_pointer, int_pointer) == 1 ); 423 CPPUNIT_CHECK( are_both_pointer_type(int_const_pointer, int_const_pointer) == 1 ); 424 CPPUNIT_CHECK( are_both_pointer_type(int_volatile_pointer, int_volatile_pointer) == 1 ); 425 CPPUNIT_CHECK( are_both_pointer_type(int_const_volatile_pointer, int_const_volatile_pointer) == 1 ); 426 CPPUNIT_CHECK( are_both_pointer_type(int_ref, int_ref) == 0 ); 427 CPPUNIT_CHECK( are_both_pointer_type(int_const_ref, int_const_ref) == 0 ); 428 CPPUNIT_CHECK( are_both_pointer_type(any, any) == 0 ); 429 CPPUNIT_CHECK( are_both_pointer_type(any_pointer, any_pointer) == 1 ); 430 #endif 431 } 432 433 #if defined (STLPORT) 434 template <typename _Tp1, typename _Tp2> 435 int is_ok_to_use_memcpy(_Tp1 val1, _Tp2 val2) { 436 return type_to_value(_UseTrivialCopy(val1, val2)._Answer()); 437 } 438 #endif 439 440 void TypeTraitsTest::ok_to_use_memcpy() 441 { 442 #if defined (STLPORT) && !defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) 443 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_pointer, int_pointer) == 1 ); 444 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_const_pointer, int_pointer) == 1 ); 445 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_pointer, int_volatile_pointer) == 0 ); 446 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_pointer, int_const_volatile_pointer) == 0 ); 447 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_const_pointer, int_const_pointer) == 0 ); 448 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_const_pointer, int_volatile_pointer) == 0 ); 449 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_const_pointer, int_const_volatile_pointer) == 0 ); 450 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_const_volatile_pointer, int_const_volatile_pointer) == 0 ); 451 CPPUNIT_CHECK( is_ok_to_use_memcpy(int_pointer, any_pointer) == 0 ); 452 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pointer, int_pointer) == 0 ); 453 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pointer, any_pointer) == 0 ); 454 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pointer, any_const_pointer) == 0 ); 455 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pod_pointer, int_pointer) == 0 ); 456 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pod_pointer, any_pod_pointer) == 1 ); 457 CPPUNIT_CHECK( is_ok_to_use_memcpy(any_pod_pointer, any_pod_const_pointer) == 0 ); 458 vector<float> **pvf = 0; 459 vector<int> **pvi = 0; 460 CPPUNIT_CHECK( is_ok_to_use_memcpy(pvf, pvi) == 0 ); 461 CPPUNIT_CHECK( is_ok_to_use_memcpy(pvi, pvf) == 0 ); 462 #endif 463 } 464 465 #if defined (STLPORT) 466 template <typename _Tp1, typename _Tp2> 467 int is_ok_to_use_memmove(_Tp1 val1, _Tp2 val2) { 468 return type_to_value(_UseTrivialUCopy(val1, val2)._Answer()); 469 } 470 #endif 471 472 void TypeTraitsTest::ok_to_use_memmove() 473 { 474 #if defined (STLPORT) && !defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) 475 CPPUNIT_CHECK( is_ok_to_use_memmove(int_pointer, int_pointer) == 1 ); 476 CPPUNIT_CHECK( is_ok_to_use_memmove(int_const_pointer, int_pointer) == 1 ); 477 CPPUNIT_CHECK( is_ok_to_use_memmove(int_pointer, int_volatile_pointer) == 0 ); 478 CPPUNIT_CHECK( is_ok_to_use_memmove(int_pointer, int_const_volatile_pointer) == 0 ); 479 CPPUNIT_CHECK( is_ok_to_use_memmove(int_const_pointer, int_const_pointer) == 0 ); 480 CPPUNIT_CHECK( is_ok_to_use_memmove(int_const_pointer, int_volatile_pointer) == 0 ); 481 CPPUNIT_CHECK( is_ok_to_use_memmove(int_const_pointer, int_const_volatile_pointer) == 0 ); 482 CPPUNIT_CHECK( is_ok_to_use_memmove(int_const_volatile_pointer, int_const_volatile_pointer) == 0 ); 483 CPPUNIT_CHECK( is_ok_to_use_memmove(int_pointer, any_pointer) == 0 ); 484 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pointer, int_pointer) == 0 ); 485 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pointer, any_pointer) == 0 ); 486 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pointer, any_const_pointer) == 0 ); 487 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pod_pointer, int_pointer) == 0 ); 488 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pod_pointer, any_pod_pointer) == 1 ); 489 CPPUNIT_CHECK( is_ok_to_use_memmove(any_pod_pointer, any_pod_const_pointer) == 0 ); 490 #endif 491 } 492 493 #if defined (STLPORT) 494 template <typename _Tp> 495 int has_trivial_destructor(_Tp) { 496 typedef typename __type_traits<_Tp>::has_trivial_destructor _TrivialDestructor; 497 return type_to_value(_TrivialDestructor()); 498 } 499 500 struct DestructorMonitor 501 { 502 ~DestructorMonitor() 503 { ++nb_destructor_call; } 504 505 static size_t nb_destructor_call; 506 }; 507 508 size_t DestructorMonitor::nb_destructor_call = 0; 509 510 # if defined (_STLP_USE_NAMESPACES) 511 namespace std { 512 # endif 513 _STLP_TEMPLATE_NULL 514 struct __type_traits<DestructorMonitor> { 515 typedef __true_type has_trivial_default_constructor; 516 typedef __true_type has_trivial_copy_constructor; 517 typedef __true_type has_trivial_assignment_operator; 518 typedef __true_type has_trivial_destructor; 519 typedef __true_type is_POD_type; 520 }; 521 # if defined (_STLP_USE_NAMESPACES) 522 } 523 # endif 524 #endif 525 526 void TypeTraitsTest::trivial_destructor() 527 { 528 #if defined (STLPORT) 529 CPPUNIT_CHECK( has_trivial_destructor(int_pointer) == 1 ); 530 CPPUNIT_CHECK( has_trivial_destructor(int_const_pointer) == 1 ); 531 CPPUNIT_CHECK( has_trivial_destructor(int_volatile_pointer) == 1 ); 532 CPPUNIT_CHECK( has_trivial_destructor(int_const_volatile_pointer) == 1 ); 533 CPPUNIT_CHECK( has_trivial_destructor(any_pointer) == 1 ); 534 CPPUNIT_CHECK( has_trivial_destructor(any) == 0 ); 535 CPPUNIT_CHECK( has_trivial_destructor(any_pointer) == 1 ); 536 CPPUNIT_CHECK( has_trivial_destructor(any_pod) == 1 ); 537 CPPUNIT_CHECK( has_trivial_destructor(string()) == 0 ); 538 539 //Check of the meta information impact in a container implementation 540 { 541 vector<DestructorMonitor> v(10); 542 DestructorMonitor::nb_destructor_call = 0; 543 } 544 CPPUNIT_CHECK( DestructorMonitor::nb_destructor_call == 0 ); 545 #endif 546 } 547 548 #if defined (STLPORT) 549 template <typename _Tp> 550 int is_POD_type(_Tp) { 551 typedef typename __type_traits<_Tp>::is_POD_type _IsPODType; 552 return type_to_value(_IsPODType()); 553 } 554 #endif 555 556 void TypeTraitsTest::is_POD() 557 { 558 #if defined (STLPORT) 559 CPPUNIT_CHECK( is_POD_type(int_pointer) == 1 ); 560 CPPUNIT_CHECK( is_POD_type(int_const_pointer) == 1 ); 561 CPPUNIT_CHECK( is_POD_type(int_volatile_pointer) == 1 ); 562 CPPUNIT_CHECK( is_POD_type(int_const_volatile_pointer) == 1 ); 563 CPPUNIT_CHECK( is_POD_type(any_pointer) == 1 ); 564 CPPUNIT_CHECK( is_POD_type(any) == 0 ); 565 CPPUNIT_CHECK( is_POD_type(any_pointer) == 1 ); 566 CPPUNIT_CHECK( is_POD_type(any_pod) == 1 ); 567 CPPUNIT_CHECK( is_POD_type(string()) == 0 ); 568 #endif 569 } 570 571 #if defined (STLPORT) 572 template <typename _Tp> 573 int is_stlport_class(_Tp) { 574 typedef _IsSTLportClass<_Tp> _STLportClass; 575 # if !defined (__BORLANDC__) 576 typedef typename _STLportClass::_Ret _Is; 577 # else 578 typedef typename __bool2type<_STLportClass::_Is>::_Ret _Is; 579 # endif 580 return type_to_value(_Is()); 581 } 582 #endif 583 584 void TypeTraitsTest::stlport_class() 585 { 586 #if defined (STLPORT) 587 CPPUNIT_CHECK( is_stlport_class(allocator<char>()) == 1 ); 588 # if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 589 CPPUNIT_CHECK( is_stlport_class(string()) == 1 ); 590 # endif 591 CPPUNIT_CHECK( is_stlport_class(any) == 0 ); 592 #endif 593 } 594