blob: f56fb418c296123df931b4153bc81f6641f8dfda [file] [log] [blame]
/***************************************************************************
*
* limits_bits.cpp - source for the C++ Standard Library limits constants
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the License); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2007 Rogue Wave Software, Inc.
*
**************************************************************************/
#define _RWSTD_LIB_SRC
#include <float.h> // for INFINITY, NAN
#include <stdlib.h> // for atof()
// must not #include <limits> to avoid colliding with symbols
// declared there with a different type than what they are
// defined with here
// #include <limits>
#include <rw/_defs.h>
_RWSTD_NAMESPACE (__rw) {
#ifndef _RWSTD_NO_INFINITY
# if !defined (_RWSTD_DBL_INF_BITS)
# error one of _RWSTD_NO_INFINITY and _RWSTD_DBL_INF_BITS must be #defined
# endif
union _FltBits {
char _C_bits [sizeof (float)];
float _C_val;
};
union _DblBits {
char _C_bits [sizeof (double)];
double _C_val;
};
# ifndef _RWSTD_NO_LONG_DOUBLE
union _LDblBits {
char _C_bits [sizeof (long double)];
long double _C_val;
};
# endif // _RWSTD_NO_LONG_DOUBLE
# ifndef _RWSTD_NO_OBJECT_MANGLING
extern "C" {
# else // if defined (_RWSTD_NO_OBJECT_MANGLING)
extern "C++" {
# endif // _RWSTD_NO_OBJECT_MANGLING
// The constants below are declared in <limits> but with a different
// type. C linkage is (conditionally) used to defeat MSVC and other
// "clever" compilers that mangle the type of objects into their names.
// infinity computed at config time
_RWSTD_EXPORT extern const _DblBits
__rw_dbl_infinity = { _RWSTD_DBL_INF_BITS };
_RWSTD_EXPORT extern const _FltBits
__rw_flt_infinity = { _RWSTD_FLT_INF_BITS };
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const _LDblBits
__rw_ldbl_infinity = { _RWSTD_LDBL_INF_BITS };
# endif // _RWSTD_NO_LONG_DOUBLE
// quiet NaN computed at config time
_RWSTD_EXPORT extern const _DblBits
__rw_dbl_qNaN = { _RWSTD_DBL_QNAN_BITS };
_RWSTD_EXPORT extern const _FltBits
__rw_flt_qNaN = { _RWSTD_FLT_QNAN_BITS };
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const _LDblBits
__rw_ldbl_qNaN = { _RWSTD_LDBL_QNAN_BITS };
# endif // _RWSTD_NO_LONG_DOUBLE
// signaling NaN computed at config time
_RWSTD_EXPORT extern const _DblBits
__rw_dbl_sNaN = { _RWSTD_DBL_SNAN_BITS };
_RWSTD_EXPORT extern const _FltBits
__rw_flt_sNaN = { _RWSTD_FLT_SNAN_BITS };
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const _LDblBits
__rw_ldbl_sNaN = { _RWSTD_LDBL_SNAN_BITS };
# endif // _RWSTD_NO_LONG_DOUBLE
// denormalized minima computed at config time
_RWSTD_EXPORT extern const _DblBits
__rw_dbl_denorm_min = { _RWSTD_DBL_DENORM_MIN_BITS };
_RWSTD_EXPORT extern const _FltBits
__rw_flt_denorm_min = { _RWSTD_FLT_DENORM_MIN_BITS };
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const _LDblBits
__rw_ldbl_denorm_min = { _RWSTD_LDBL_DENORM_MIN_BITS };
# endif // _RWSTD_NO_LONG_DOUBLE
} // extern "C"/"C++"
# if _RWSTD_VER_MAJOR < 5 && defined (_MSC_VER) && defined (_DLL)
// The constants below are defined with C++ linkage
// to be exported as floating constants with mangled
// names for binary compatibility with stdcxx 4.1.x
extern const _FltBits
__rw_flt_infinity_vc = { _RWSTD_FLT_INF_BITS };
extern const _FltBits
__rw_flt_qNaN_vc = { _RWSTD_FLT_QNAN_BITS };
extern const _FltBits
__rw_flt_sNaN_vc = { _RWSTD_FLT_SNAN_BITS };
extern const _FltBits
__rw_flt_denorm_min_vc = { _RWSTD_FLT_DENORM_MIN_BITS };
extern const _DblBits
__rw_dbl_infinity_vc = { _RWSTD_DBL_INF_BITS };
extern const _DblBits
__rw_dbl_qNaN_vc = { _RWSTD_DBL_QNAN_BITS };
extern const _DblBits
__rw_dbl_sNaN_vc = { _RWSTD_DBL_SNAN_BITS };
extern const _DblBits
__rw_dbl_denorm_min_vc = { _RWSTD_DBL_DENORM_MIN_BITS };
# ifndef _RWSTD_NO_LONG_DOUBLE
extern const _LDblBits
__rw_ldbl_infinity_vc = { _RWSTD_LDBL_INF_BITS };
extern const _LDblBits
__rw_ldbl_qNaN_vc = { _RWSTD_LDBL_QNAN_BITS };
extern const _LDblBits
__rw_ldbl_sNaN_vc = { _RWSTD_LDBL_SNAN_BITS };
extern const _LDblBits
__rw_ldbl_denorm_min_vc = { _RWSTD_LDBL_DENORM_MIN_BITS };
# endif // _RWSTD_NO_LONG_DOUBLE
# pragma comment (linker, "/EXPORT:?__rw_flt_infinity@__rw@@3MB=?__rw_flt_infinity_vc@__rw@@3T_FltBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_flt_qNaN@__rw@@3MB=?__rw_flt_qNaN_vc@__rw@@3T_FltBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_flt_sNaN@__rw@@3MB=?__rw_flt_sNaN_vc@__rw@@3T_FltBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_flt_denorm_min@__rw@@3MB=?__rw_flt_denorm_min_vc@__rw@@3T_FltBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_dbl_infinity@__rw@@3NB=?__rw_dbl_infinity_vc@__rw@@3T_DblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_dbl_qNaN@__rw@@3NB=?__rw_dbl_qNaN_vc@__rw@@3T_DblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_dbl_sNaN@__rw@@3NB=?__rw_dbl_sNaN_vc@__rw@@3T_DblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_dbl_denorm_min@__rw@@3NB=?__rw_dbl_denorm_min_vc@__rw@@3T_DblBits@1@B,DATA")
# ifndef _RWSTD_NO_LONG_DOUBLE
# pragma comment (linker, "/EXPORT:?__rw_ldbl_infinity@__rw@@3OB=?__rw_ldbl_infinity_vc@__rw@@3T_LDblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_ldbl_qNaN@__rw@@3OB=?__rw_ldbl_qNaN_vc@__rw@@3T_LDblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_ldbl_sNaN@__rw@@3OB=?__rw_ldbl_sNaN_vc@__rw@@3T_LDblBits@1@B,DATA")
# pragma comment (linker, "/EXPORT:?__rw_ldbl_denorm_min@__rw@@3OB=?__rw_ldbl_denorm_min_vc@__rw@@3T_LDblBits@1@B,DATA")
# endif // _RWSTD_NO_LONG_DOUBLE
#endif // _RWSTD_VER_MAJOR < 5 && _MSC_VER && _DLL
#else // if defined (_RWSTD_NO_INFINITY)
# ifndef _RWSTD_NO_OBJECT_MANGLING
extern "C" {
# else // if defined (_RWSTD_NO_OBJECT_MANGLING)
extern "C++" {
# endif // _RWSTD_NO_OBJECT_MANGLING
// as the last resort compute values at dynamic initialization time
_RWSTD_EXPORT extern const float __rw_flt_infinity =
# if defined (INFINITY)
INFINITY;
# elif defined (FLT_INFINITY)
FLT_INFINITY;
# elif defined (__osf__)
0.0f; // prevent SIGFPE at startup (PR #23163)
# else // if !defined (__osf__)
_RWSTD_STATIC_CAST (float, atof ("INF"));
# endif // __osf__
_RWSTD_EXPORT extern const double __rw_dbl_infinity = __rw_flt_infinity;
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const long double __rw_ldbl_infinity = __rw_flt_infinity;
# endif // _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const float __rw_flt_qNaN =
# if defined (NAN)
NAN;
# elif defined (FLT_QNAN)
FLT_QNAN;
# elif defined (__osf__)
0.0; // prevent SIGFPE at startup (PR #23163)
# else // if !defined (__osf__)
_RWSTD_STATIC_CAST (float, atof ("NAN"));
# endif // __osf__
_RWSTD_EXPORT extern const float __rw_flt_sNaN =
# if defined (FLT_SNAN)
FLT_SNAN;
# else // if !defined (FLT_SNAN)
__rw_flt_qNaN;
# endif // FLT_SNAN
_RWSTD_EXPORT extern const double __rw_dbl_qNaN = __rw_flt_qNaN;
_RWSTD_EXPORT extern const double __rw_dbl_sNaN = __rw_flt_sNaN;
_RWSTD_EXPORT extern const float __rw_flt_denorm_min = 0;
_RWSTD_EXPORT extern const float __rw_dbl_denorm_min = 0;
# ifndef _RWSTD_NO_LONG_DOUBLE
_RWSTD_EXPORT extern const long double __rw_ldbl_qNaN = __rw_dbl_qNaN;
_RWSTD_EXPORT extern const long double __rw_ldbl_sNaN = __rw_dbl_sNaN;
_RWSTD_EXPORT extern const long double __rw_ldbl_denorm_min = 0;
# endif // _RWSTD_NO_LONG_DOUBLE
} // extern "C"/"C++"
#endif // _RWSTD_NO_INFINITY
} // namespace __rw