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