1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* boost limits_test.cpp test your <limits> file for important 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright Jens Maurer 2000 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use, copy, modify, sell, and distribute this software 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * is hereby granted without fee provided that the above copyright notice 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * appears in all copies and that both that copyright notice and this 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * permission notice appear in supporting documentation, 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Jens Maurer makes no representations about the suitability of this 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * software for any purpose. It is provided "as is" without express or 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * implied warranty. 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <limits> 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//#include <sstream> 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h" 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std; 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass LimitTest : public CPPUNIT_NS::TestCase 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE(LimitTest); 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (__BORLANDC__) 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* Ignore FPU exceptions, set FPU precision to 64 bits */ 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott unsigned int _float_control_word = _control87(0, 0); 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _control87(PC_64|MCW_EM|IC_AFFINE, MCW_PC|MCW_EM|MCW_IC); 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(test); 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(qnan_test); 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (__BORLANDC__) 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* Reset floating point control word */ 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _clear87(); 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _control87(_float_control_word, MCW_PC|MCW_EM|MCW_IC); 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE_END(); 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected: 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void test(); 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void qnan_test(); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(LimitTest); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && defined (_STLP_STATIC_CONST_INIT_BUG) 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define CHECK_COND(X) if (!(X)) { CPPUNIT_MESSAGE(#X); return false; } 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//This version force to have external linkage on static constant which might 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//reveal that _STLP_NO_STATIC_CONST_DEFINITION should be commented. 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool check_cond(const bool& cond) { return cond; } 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define CHECK_COND(X) if (!check_cond(X)) { CPPUNIT_MESSAGE(#X); return false; } 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool valid_sign_info(bool, bool) 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return true; } 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool valid_sign_info(bool limit_is_signed, const _Tp &) { 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return (limit_is_signed && _Tp(-1) < 0) || 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!limit_is_signed && _Tp(-1) > 0); 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_integral_limits_base(const _Tp &, bool unknown_sign = true, bool is_signed = true) { 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef numeric_limits<_Tp> lim; 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_specialized); 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_exact); 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_integer); 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(!lim::is_iec559); 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::min() < lim::max()); 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND((unknown_sign && ((lim::is_signed && (lim::min() != 0)) || (!lim::is_signed && (lim::min() == 0)))) || 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!unknown_sign && ((lim::is_signed && is_signed) || (!lim::is_signed && !is_signed)))); 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (unknown_sign) { 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(valid_sign_info(lim::is_signed, _Tp())); 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_integral_limits(const _Tp &val, bool unknown_sign = true, bool is_signed = true) { 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!test_integral_limits_base(val, unknown_sign, is_signed)) 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return false; 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef numeric_limits<_Tp> lim; 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_modulo); 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::is_bounded || 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (!lim::is_bounded && !lim::is_signed)) { 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp tmp = lim::min(); 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND( --tmp > lim::min() ); 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::is_bounded) { 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp tmp = lim::max(); 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND( ++tmp < lim::max() ); 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_signed_integral_limits(const _Tp &__val) { 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return test_integral_limits(__val, false, true); 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_unsigned_integral_limits(const _Tp &__val) { 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return test_integral_limits(__val, false, false); 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_float_values(_Tp lhs, _Tp rhs) 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return lhs == rhs; } 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_float_limits(const _Tp &) { 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef numeric_limits<_Tp> lim; 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_specialized); 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(!lim::is_modulo); 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(!lim::is_integer); 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::is_signed); 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::max() > 1000); 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::min() > 0); 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::min() < 0.001); 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::epsilon() > 0); 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::is_iec559) { 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::has_infinity); 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::has_quiet_NaN); 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::has_signaling_NaN); 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::has_denorm == denorm_present); 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::has_denorm == denorm_absent) { 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::denorm_min() == lim::min()); 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp tmp = lim::min(); 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott tmp /= 2; 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (tmp > 0 && tmp < lim::min()) { 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // has_denorm could be denorm_present 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE("It looks like your compiler/platform supports denormalized floating point representation."); 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else if (lim::has_denorm == denorm_present) { 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::denorm_min() > 0); 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(lim::denorm_min() < lim::min()); 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp tmp = lim::min(); 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott while (tmp != 0) { 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp old_tmp = tmp; 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott tmp /= 2; 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(tmp < old_tmp); 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(tmp >= lim::denorm_min() || tmp == (_Tp)0); 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //ostringstream str; 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //str << "denorm_min = " << lim::denorm_min() << ", tmp = " << tmp; 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_MESSAGE(str.str().c_str()); 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::has_infinity) { 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const _Tp infinity = lim::infinity(); 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* Make sure those values are not 0 or similar nonsense. 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Infinity must compare as if larger than the maximum representable value. */ 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Tp val = lim::max(); 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott val *= 2; 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* We use test_float_values because without it some compilers (gcc) perform weird 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * optimization on the test giving unexpected result. */ 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(test_float_values(val, infinity)); 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream str; 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "lim::max() = " << lim::max() << ", val = " << val << ", infinity = " << infinity; 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( str.str().c_str() ); 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str.str(string()); 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "sizeof(_Tp) = " << sizeof(_Tp); 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( str.str().c_str() ); 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (sizeof(_Tp) == 4) { 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str.str(string()); 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "val in hexa: " << showbase << hex << *((const unsigned int*)&val); 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << ", infinity in hexa: " << showbase << hex << *((const unsigned int*)&infinity); 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_LONG_LONG) 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else if (sizeof(_Tp) == sizeof(_STLP_LONG_LONG)) { 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str.str(string()); 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "val in hexa: " << showbase << hex << *((const unsigned _STLP_LONG_LONG*)&val); 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << ", infinity in hexa: " << showbase << hex << *((const unsigned _STLP_LONG_LONG*)&infinity); 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str.str(string()); 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "val: "; 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i != sizeof(_Tp) / sizeof(unsigned short); ++i) { 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (i != 0) str << ' '; 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << showbase << hex << setw(4) << setfill('0') << *((const unsigned short*)&val + i); 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << ", infinity: "; 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (int i = 0; i != sizeof(_Tp) / sizeof(unsigned short); ++i) { 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (i != 0) str << ' '; 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << showbase << hex << setw(4) << setfill('0') << *((const unsigned short*)&infinity + i); 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( str.str().c_str() ); 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str.str(string()); 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << dec; 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "lim::digits = " << lim::digits << ", lim::digits10 = " << lim::digits10 << endl; 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "lim::min_exponent = " << lim::min_exponent << ", lim::min_exponent10 = " << lim::min_exponent10 << endl; 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott str << "lim::max_exponent = " << lim::max_exponent << ", lim::max_exponent10 = " << lim::max_exponent10 << endl; 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( str.str().c_str() ); 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(infinity == infinity); 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(infinity > lim::max()); 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(-infinity < -lim::max()); 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//float generate_nan(float f) { 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// return 0.0f / f; 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//} 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp> 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool test_qnan(const _Tp &) { 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef numeric_limits<_Tp> lim; 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (lim::has_quiet_NaN) { 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const _Tp qnan = lim::quiet_NaN(); 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //if (sizeof(_Tp) == 4) { 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // ostringstream str; 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // str << "qnan " << qnan << ", in hexa: " << showbase << hex << *((unsigned int*)&qnan); 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // CPPUNIT_MESSAGE( str.str().c_str() ); 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // str.str(""); 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // float val = generate_nan(0.0f); 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // str << "val " << val << ", in hexa: " << showbase << hex << *((unsigned int*)&val); 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // CPPUNIT_MESSAGE( str.str().c_str() ); 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // str.str(""); 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // val = -qnan; 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // str << "-qnan " << val << ", in hexa: " << showbase << hex << *((unsigned int*)&val); 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // CPPUNIT_MESSAGE( str.str().c_str() ); 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //} 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* NaNs shall always compare "false" when compared for equality 252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * If one of these fail, your compiler may be optimizing incorrectly, 253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or the STLport is incorrectly configured. 254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(! (qnan == 42)); 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(! (qnan == qnan)); 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(qnan != 42); 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CHECK_COND(qnan != qnan); 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* The following tests may cause arithmetic traps. 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * CHECK_COND(! (qnan < 42)); 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * CHECK_COND(! (qnan > 42)); 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * CHECK_COND(! (qnan <= 42)); 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * CHECK_COND(! (qnan >= 42)); 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return true; 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass ArbitraryType 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{}; 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LimitTest::test() { 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_integral_limits_base(bool())); 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_integral_limits(char())); 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef signed char signed_char; 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_signed_integral_limits(signed_char())); 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef unsigned char unsigned_char; 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_unsigned_integral_limits(unsigned_char())); 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_WCHAR_T_IS_USHORT) 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_integral_limits(wchar_t())); 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_signed_integral_limits(short())); 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef unsigned short unsigned_short; 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_unsigned_integral_limits(unsigned_short())); 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_signed_integral_limits(int())); 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef unsigned int unsigned_int; 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_unsigned_integral_limits(unsigned_int())); 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_signed_integral_limits(long())); 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef unsigned long unsigned_long; 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_unsigned_integral_limits(unsigned_long())); 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined (_STLP_LONG_LONG) 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef _STLP_LONG_LONG long_long; 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_signed_integral_limits(long_long())); 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef unsigned _STLP_LONG_LONG unsigned_long_long; 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_unsigned_integral_limits(unsigned_long_long())); 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_float_limits(float())); 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_float_limits(double())); 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined ( _STLP_NO_LONG_DOUBLE ) 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef long double long_double; 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_float_limits(long_double())); 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !numeric_limits<ArbitraryType>::is_specialized ); 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LimitTest::qnan_test() { 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_qnan(float())); 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_qnan(double())); 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined ( _STLP_NO_LONG_DOUBLE ) 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef long double long_double; 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_CHECK(test_qnan(long_double())); 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 318