Home | History | Annotate | Download | only in stl
      1 /*
      2  * Copyright (c) 1999
      3  * Boris Fomitchev
      4  *
      5  * This material is provided "as is", with absolutely no warranty expressed
      6  * or implied. Any use is at your own risk.
      7  *
      8  * Permission to use or copy this software for any purpose is hereby granted
      9  * without fee, provided the above notices are retained on all copies.
     10  * Permission to modify the code and to distribute modified code is granted,
     11  * provided the above notices are retained, and a notice that the code was
     12  * modified is included with the above copyright notice.
     13  *
     14  */
     15 
     16 #ifndef _STLP_INTERNAL_CMATH
     17 #define _STLP_INTERNAL_CMATH
     18 
     19 /* gcc do not like when a using directive appear after a function
     20  * declaration. cmath have abs overloads and cstdlib a using directive
     21  * so cstdlib has to be included first.
     22  */
     23 #if defined (__GNUC__) && defined (_STLP_USE_NEW_C_HEADERS)
     24 #  if defined (_STLP_HAS_INCLUDE_NEXT)
     25 #    include_next <cstdlib>
     26 #  else
     27 #    include _STLP_NATIVE_CPP_C_HEADER(cstdlib)
     28 #  endif
     29 #endif
     30 
     31 #if defined (_STLP_USE_NEW_C_HEADERS)
     32 #  if defined (_STLP_HAS_NO_NAMESPACES) && !defined (exception)
     33 #    define exception __math_exception
     34 #  endif
     35 #  if defined (_STLP_HAS_INCLUDE_NEXT)
     36 #    include_next <cmath>
     37 #  else
     38 #    include _STLP_NATIVE_CPP_C_HEADER(cmath)
     39 #  endif
     40 #  if defined (_STLP_HAS_NO_NAMESPACES)
     41 #    undef exception
     42 #  endif
     43 #else
     44 #  include <math.h>
     45 #endif
     46 
     47 #if (defined (__SUNPRO_CC) && (__SUNPRO_CC > 0x500)) || \
     48      !(defined (__IBMCPP__) && (__IBMCPP__ >= 500) || !(defined(__HP_aCC) && (__HP_aCC >= 30000) ))
     49 #  if !defined(_STLP_HAS_NO_NAMESPACES) && !defined(__SUNPRO_CC)
     50 // All the other hypot stuff is going to be at file scope, so follow along here.
     51 namespace std {
     52 #  endif
     53 extern "C" double hypot(double x, double y);
     54 #  if !defined(_STLP_HAS_NO_NAMESPACES) && !defined(__SUNPRO_CC)
     55 }
     56 #  endif
     57 
     58 #endif
     59 
     60 #if defined (__sun) && defined (__GNUC__)
     61 extern "C" {
     62   float __cosf(float v);
     63   float __sinf(float v);
     64   float __atan2f(float, float);
     65   float __coshf(float v);
     66   float __sinhf(float v);
     67   float __sqrtf(float v);
     68   float __expf(float v);
     69   float __logf(float v);
     70   float __log10f(float v);
     71 
     72   long double __cosl(long double v);
     73   long double __sinl(long double v);
     74   long double __atan2l(long double, long double);
     75   long double __coshl(long double v);
     76   long double __sinhl(long double v);
     77   long double __sqrtl(long double v);
     78   long double __expl(long double v);
     79   long double __logl(long double v);
     80   long double __log10l(long double v);
     81 }
     82 
     83 extern "C" {
     84   inline float cosf(float v) { return __cosf(v); }
     85   inline float sinf(float v) { return __sinf(v); }
     86   inline float atan2f(float v1, float v2) { return __atan2f(v1,v2); }
     87   inline float coshf(float v) { return __coshf(v); }
     88   inline float sinhf(float v) { return __sinhf(v); }
     89   inline float sqrtf(float v) { return __sqrtf(v); }
     90   inline float expf(float v) { return __expf(v); }
     91   inline float logf(float v) { return __logf(v); }
     92   inline float log10f(float v) { return __log10f(v); }
     93 
     94   inline long double cosl(long double v) { return __cosl(v); }
     95   inline long double sinl(long double v) { return __sinl(v); }
     96   inline long double atan2l(long double v1, long double v2) { return __atan2l(v1,v2); }
     97   inline long double coshl(long double v) { return __coshl(v); }
     98   inline long double sinhl(long double v) { return __sinhl(v); }
     99   inline long double sqrtl(long double v) { return __sqrtl(v); }
    100   inline long double expl(long double v) { return __expl(v); }
    101   inline long double logl(long double v) { return __logl(v); }
    102   inline long double log10l(long double v) { return __log10l(v); }
    103 }
    104 #endif // __sun && __GNUC__
    105 
    106 #if defined (__sun)
    107 extern "C" {
    108 extern float __acosf(float);
    109 extern float __asinf(float);
    110 extern float __atanf(float);
    111 extern float __atan2f(float, float);
    112 extern float __ceilf(float);
    113 extern float __cosf(float);
    114 extern float __coshf(float);
    115 extern float __expf(float);
    116 extern float __fabsf(float);
    117 extern float __floorf(float);
    118 extern float __fmodf(float, float);
    119 extern float __frexpf(float, int *);
    120 extern float __ldexpf(float, int);
    121 extern float __logf(float);
    122 extern float __log10f(float);
    123 extern float __modff(float, float *);
    124 extern float __powf(float, float);
    125 extern float __sinf(float);
    126 extern float __sinhf(float);
    127 extern float __sqrtf(float);
    128 extern float __tanf(float);
    129 extern float __tanhf(float);
    130 
    131 extern long double __acosl(long double);
    132 extern long double __asinl(long double);
    133 extern long double __atanl(long double);
    134 extern long double __atan2l(long double, long double);
    135 extern long double __ceill(long double);
    136 extern long double __cosl(long double);
    137 extern long double __coshl(long double);
    138 extern long double __expl(long double);
    139 extern long double __fabsl(long double);
    140 extern long double __floorl(long double);
    141 extern long double __fmodl(long double, long double);
    142 extern long double __frexpl(long double, int *);
    143 extern long double __ldexpl(long double, int);
    144 extern long double __logl(long double);
    145 extern long double __log10l(long double);
    146 extern long double __modfl(long double, long double *);
    147 extern long double __powl(long double, long double);
    148 extern long double __sinl(long double);
    149 extern long double __sinhl(long double);
    150 extern long double __sqrtl(long double);
    151 extern long double __tanl(long double);
    152 extern long double __tanhl(long double);
    153 }
    154 #endif
    155 
    156 #if defined (__BORLANDC__)
    157 #  define _STLP_CMATH_FUNC_NAMESPACE _STLP_VENDOR_CSTD
    158 #else
    159 #  define _STLP_CMATH_FUNC_NAMESPACE
    160 #endif
    161 
    162 #if !defined (__sun) || defined (__GNUC__)
    163 #  define _STLP_MATH_INLINE(float_type, func, cfunc) \
    164      inline float_type func (float_type x) { return _STLP_CMATH_FUNC_NAMESPACE::cfunc(x); }
    165 #  define _STLP_MATH_INLINE2(float_type, type, func, cfunc) \
    166      inline float_type func (float_type x, type y) { return _STLP_CMATH_FUNC_NAMESPACE::cfunc(x, y); }
    167 #  define _STLP_MATH_INLINE_D(float_type, func, cfunc)
    168 #  define _STLP_MATH_INLINE2_D(float_type, type, func, cfunc)
    169 #else
    170 #  ifdef __SUNPRO_CC
    171 #    define _STLP_MATH_INLINE(float_type, func, cfunc) \
    172        inline float_type func (float_type x) { return _STLP_VENDOR_CSTD::__##cfunc(x); }
    173 #    define _STLP_MATH_INLINE_D(float_type, func, cfunc) \
    174        inline float_type func (float_type x) { return _STLP_VENDOR_CSTD::cfunc(x); }
    175 #    define _STLP_MATH_INLINE2(float_type, type, func, cfunc) \
    176        inline float_type func (float_type x, type y) { return _STLP_VENDOR_CSTD::__##cfunc(x,y); }
    177 #    define _STLP_MATH_INLINE2_D(float_type, type, func, cfunc) \
    178        inline float_type func (float_type x, type y) { return _STLP_VENDOR_CSTD::cfunc(x,y); }
    179 #  else
    180 #    error Unknown compiler for the Sun platform
    181 #  endif
    182 #endif
    183 
    184 /** macros to define math functions
    185 These macros (having an X somewhere in the name) forward to the C library's
    186 double functions but cast the arguments and return values to the given type. */
    187 
    188 #define _STLP_MATH_INLINEX(__type,func,cfunc) \
    189   inline __type func (__type x) \
    190   { return __STATIC_CAST(__type, _STLP_CMATH_FUNC_NAMESPACE::cfunc((double)x)); }
    191 #define _STLP_MATH_INLINE2X(__type1,__type2,func,cfunc) \
    192   inline __type1 func (__type1 x, __type2 y) \
    193   { return __STATIC_CAST(__type1, _STLP_CMATH_FUNC_NAMESPACE::cfunc((double)x, y)); }
    194 #define _STLP_MATH_INLINE2PX(__type,func,cfunc) \
    195   inline __type func (__type x, __type *y) { \
    196     double tmp1, tmp2; \
    197     tmp1 = _STLP_CMATH_FUNC_NAMESPACE::cfunc(__STATIC_CAST(double, x), &tmp2); \
    198     *y = __STATIC_CAST(__type, tmp2); \
    199     return __STATIC_CAST(__type, tmp1); \
    200   }
    201 #define _STLP_MATH_INLINE2XX(__type,func,cfunc) \
    202   inline __type func (__type x, __type y) \
    203   { return __STATIC_CAST(__type, _STLP_CMATH_FUNC_NAMESPACE::cfunc((double)x, (double)y)); }
    204 
    205 
    206 /** rough characterization of compiler and native C library
    207 For the compiler, it can either support long double or not. If it doesn't, the
    208 macro _STLP_NO_LONG_DOUBLE is not defined and we don't define any long double
    209 overloads.
    210 For the native C library the question is whether it has variants with an 'f'
    211 suffix (for float as opposed to double) or an 'l' suffix (for long double). If
    212 the float variants are missing, _STLP_NO_VENDOR_MATH_F is defined, when the
    213 long double variants are missing, _STLP_NO_VENDOR_MATH_L is defined. Of course
    214 the latter doesn't make sense anyway when the compiler already has no long
    215 double support.
    216 
    217 Those two traits determine a) which overloads get defined and b) how they are
    218 defined.
    219 
    220 Meaning of suffixes:
    221 ""   : function returning and taking a float_type
    222 "2"  : function returning a float_type and taking to float_types
    223 "2P" : function returning a float_type and taking a float_type and a float_type*
    224 "2PI": function returning a float_type and taking a float_type and an int*
    225 "2I" : function returning a float_type and taking a float_Type and an int
    226 */
    227 
    228 #if !defined (_STLP_NO_LONG_DOUBLE) && !defined (_STLP_NO_VENDOR_MATH_L) && !defined (_STLP_NO_VENDOR_MATH_F)
    229    // long double support and both e.g. sinl(long double) and sinf(float)
    230    // This is the default for a correct and complete native library.
    231 #  define _STLP_DEF_MATH_INLINE(func,cf) \
    232   _STLP_MATH_INLINE(float,func,cf##f) \
    233   _STLP_MATH_INLINE_D(double,func,cf) \
    234   _STLP_MATH_INLINE(long double,func,cf##l)
    235 #  define _STLP_DEF_MATH_INLINE2(func,cf) \
    236   _STLP_MATH_INLINE2(float,float,func,cf##f) \
    237   _STLP_MATH_INLINE2_D(double,double,func,cf) \
    238   _STLP_MATH_INLINE2(long double,long double,func,cf##l)
    239 #  define _STLP_DEF_MATH_INLINE2P(func,cf) \
    240   _STLP_MATH_INLINE2(float,float *,func,cf##f) \
    241   _STLP_MATH_INLINE2_D(double,double *,func,cf) \
    242   _STLP_MATH_INLINE2(long double,long double *,func,cf##l)
    243 #  define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    244   _STLP_MATH_INLINE2(float,int *,func,cf##f) \
    245   _STLP_MATH_INLINE2_D(double,int *,func,cf) \
    246   _STLP_MATH_INLINE2(long double,int *,func,cf##l)
    247 #  define _STLP_DEF_MATH_INLINE2I(func,cf) \
    248   _STLP_MATH_INLINE2(float,int,func,cf##f) \
    249   _STLP_MATH_INLINE2_D(double,int,func,cf) \
    250   _STLP_MATH_INLINE2(long double,int,func,cf##l)
    251 #else
    252 #  if !defined (_STLP_NO_LONG_DOUBLE)
    253 #    if !defined (_STLP_NO_VENDOR_MATH_F)
    254        // long double support and e.g. sinf(float) but not e.g. sinl(long double)
    255 #      define _STLP_DEF_MATH_INLINE(func,cf) \
    256       _STLP_MATH_INLINE(float,func,cf##f) \
    257       _STLP_MATH_INLINEX(long double,func,cf)
    258 #      define _STLP_DEF_MATH_INLINE2(func,cf) \
    259       _STLP_MATH_INLINE2(float,float,func,cf##f) \
    260       _STLP_MATH_INLINE2XX(long double,func,cf)
    261 #      define _STLP_DEF_MATH_INLINE2P(func,cf) \
    262       _STLP_MATH_INLINE2(float,float *,func,cf##f) \
    263       _STLP_MATH_INLINE2PX(long double,func,cf)
    264 #      define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    265       _STLP_MATH_INLINE2(float,int *,func,cf##f) \
    266       _STLP_MATH_INLINE2X(long double,int *,func,cf)
    267 #      define _STLP_DEF_MATH_INLINE2I(func,cf) \
    268       _STLP_MATH_INLINE2(float,int,func,cf##f) \
    269       _STLP_MATH_INLINE2X(long double,int,func,cf)
    270 #    elif !defined (_STLP_NO_VENDOR_MATH_L)
    271        // long double support and e.g. sinl(long double) but not e.g. sinf(float)
    272 #      define _STLP_DEF_MATH_INLINE(func,cf) \
    273       _STLP_MATH_INLINEX(float,func,cf) \
    274       _STLP_MATH_INLINE(long double,func,cf##l)
    275 #      define _STLP_DEF_MATH_INLINE2(func,cf) \
    276       _STLP_MATH_INLINE2XX(float,func,cf) \
    277       _STLP_MATH_INLINE2(long double,long double,func,cf##l)
    278 #      define _STLP_DEF_MATH_INLINE2P(func,cf) \
    279       _STLP_MATH_INLINE2PX(float,func,cf) \
    280       _STLP_MATH_INLINE2(long double,long double *,func,cf##l)
    281 #      define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    282       _STLP_MATH_INLINE2X(float,int *,func,cf) \
    283       _STLP_MATH_INLINE2(long double,int *,func,cf##l)
    284 #      define _STLP_DEF_MATH_INLINE2I(func,cf) \
    285       _STLP_MATH_INLINE2X(float,int,func,cf) \
    286       _STLP_MATH_INLINE2(long double,int,func,cf##l)
    287 #    else
    288 #      define _STLP_DEF_MATH_INLINE(func,cf) \
    289       _STLP_MATH_INLINEX(float,func,cf) \
    290       _STLP_MATH_INLINEX(long double,func,cf)
    291 #      define _STLP_DEF_MATH_INLINE2(func,cf) \
    292       _STLP_MATH_INLINE2XX(float,func,cf) \
    293       _STLP_MATH_INLINE2XX(long double,func,cf)
    294 #      define _STLP_DEF_MATH_INLINE2P(func,cf) \
    295       _STLP_MATH_INLINE2PX(float,func,cf) \
    296       _STLP_MATH_INLINE2PX(long double,func,cf)
    297 #      define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    298       _STLP_MATH_INLINE2X(float,int *,func,cf) \
    299       _STLP_MATH_INLINE2X(long double,int *,func,cf)
    300 #      define _STLP_DEF_MATH_INLINE2I(func,cf) \
    301       _STLP_MATH_INLINE2X(float,int,func,cf) \
    302       _STLP_MATH_INLINE2X(long double,int,func,cf)
    303 #    endif
    304 #  else
    305 #    if !defined (_STLP_NO_VENDOR_MATH_F)
    306 #      define _STLP_DEF_MATH_INLINE(func,cf) \
    307       _STLP_MATH_INLINE(float,func,cf##f)
    308 #      define _STLP_DEF_MATH_INLINE2(func,cf) \
    309       _STLP_MATH_INLINE2(float,float,func,cf##f)
    310 #      define _STLP_DEF_MATH_INLINE2P(func,cf) \
    311       _STLP_MATH_INLINE2(float,float *,func,cf##f)
    312 #      define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    313       _STLP_MATH_INLINE2(float,int *,func,cf##f)
    314 #      define _STLP_DEF_MATH_INLINE2I(func,cf) \
    315       _STLP_MATH_INLINE2(float,int,func,cf##f)
    316 #    else // _STLP_NO_VENDOR_MATH_F
    317        // neither long double support nor e.g. sinf(float) functions
    318 #      define _STLP_DEF_MATH_INLINE(func,cf) \
    319       _STLP_MATH_INLINEX(float,func,cf)
    320 #      define _STLP_DEF_MATH_INLINE2(func,cf) \
    321       _STLP_MATH_INLINE2XX(float,func,cf)
    322 #      define _STLP_DEF_MATH_INLINE2P(func,cf) \
    323       _STLP_MATH_INLINE2PX(float,func,cf)
    324 #      define _STLP_DEF_MATH_INLINE2PI(func,cf) \
    325       _STLP_MATH_INLINE2X(float,int *,func,cf)
    326 #      define _STLP_DEF_MATH_INLINE2I(func,cf) \
    327       _STLP_MATH_INLINE2X(float,int,func,cf)
    328 #    endif // _STLP_NO_VENDOR_MATH_F
    329 #  endif
    330 #endif
    331 
    332 #if defined (_STLP_WCE) || \
    333    (defined(_STLP_MSVC) && (_STLP_MSVC <= 1300) && defined (_MSC_EXTENSIONS) /* && !defined(_STLP_WCE_NET) */)
    334 /*
    335  * dums: VC6 has all the required C++ functions but only define them if
    336  * _MSC_EXTENSIONS is not defined (a bug?). STLport just do the same
    337  * thing also when _MSC_EXTENSIONS is defined.
    338  * TODO: above check (_STLP_MSVC <= 1300) also catches VC7.0, is that intended?
    339  */
    340 //We have to tell the compilers that abs, acos ... math functions are not intrinsic
    341 //otherwise we have Internal Compiler Error in release mode...
    342 #  pragma warning(push)
    343 #  pragma warning(disable: 4162) // no function with C linkage found
    344 #  pragma warning(disable: 4163) // not available as an intrinsic function
    345 #  pragma function (abs, acos, asin, atan, atan2, cos, cosh, exp, fabs, fmod, log, log10, sin, sinh, sqrt, tan, tanh)
    346 #  if defined (_STLP_WCE)
    347 #    pragma function (ceil, floor)
    348 #  endif
    349 #  define _STLP_RESTORE_FUNCTION_INTRINSIC
    350 #endif // _STLP_MSVC && _STLP_MSVC <= 1300 && !_STLP_WCE && _MSC_EXTENSIONS
    351 
    352 #if (defined (__BORLANDC__) || defined (__WATCOMC__)) && defined (_STLP_USE_NEW_C_HEADERS)
    353 /* In this config Borland native lib only define functions in std namespace.
    354  * In order to have all overloads in STLport namespace we need to add the
    355  * double overload in global namespace. We do not use a using statement to avoid
    356  * import of invalid overload.
    357  */
    358 #  define _STLP_DMATH_INLINE(func) _STLP_MATH_INLINE(double, func, func)
    359 #  define _STLP_DMATH_INLINE2(func) _STLP_MATH_INLINE2(double, double, func, func)
    360 
    361 _STLP_DMATH_INLINE(acos)
    362 _STLP_DMATH_INLINE(asin)
    363 _STLP_DMATH_INLINE(atan)
    364 _STLP_DMATH_INLINE2(atan2)
    365 _STLP_DMATH_INLINE(ceil)
    366 _STLP_DMATH_INLINE(cos)
    367 _STLP_DMATH_INLINE(cosh)
    368 _STLP_DMATH_INLINE(exp)
    369 _STLP_DMATH_INLINE(fabs)
    370 _STLP_DMATH_INLINE(floor)
    371 _STLP_DMATH_INLINE2(fmod)
    372 _STLP_MATH_INLINE2X(double, int*, frexp, frexp)
    373 _STLP_MATH_INLINE2X(double, int, ldexp, ldexp)
    374 _STLP_DMATH_INLINE(log)
    375 _STLP_DMATH_INLINE(log10)
    376 _STLP_MATH_INLINE2PX(double, modf, modf)
    377 _STLP_DMATH_INLINE(sin)
    378 _STLP_DMATH_INLINE(sinh)
    379 _STLP_DMATH_INLINE(sqrt)
    380 _STLP_DMATH_INLINE(tan)
    381 _STLP_DMATH_INLINE(tanh)
    382 _STLP_DMATH_INLINE2(pow)
    383 _STLP_DMATH_INLINE2(hypot)
    384 
    385 #  undef _STLP_DMATH_INLINE
    386 #  undef _STLP_DMATH_INLINE2
    387 #endif
    388 
    389 #if defined (__DMC__)
    390 #  if defined (fabs)
    391 inline double __stlp_fabs(double __x) { return fabs(__x); }
    392 #    undef fabs
    393 inline double fabs(double __x) { return __stlp_fabs(__x); }
    394 #  endif
    395 #  if defined (cos)
    396 inline double __stlp_cos(double __x) { return cos(__x); }
    397 #    undef cos
    398 inline double cos(double __x) { return __stlp_cos(__x); }
    399 #  endif
    400 #  if defined (sin)
    401 inline double __stlp_sin(double __x) { return sin(__x); }
    402 #    undef sin
    403 inline double sin(double __x) { return __stlp_sin(__x); }
    404 #  endif
    405 #  if defined (sqrt)
    406 inline double __stlp_sqrt(double __x) { return sqrt(__x); }
    407 #    undef sqrt
    408 inline double sqrt(double __x) { return __stlp_sqrt(__x); }
    409 #  endif
    410 #  if defined (ldexp)
    411 inline double __stlp_ldexp(double __x, int __y) { return ldexp(__x, __y); }
    412 #    undef ldexp
    413 inline double ldexp(double __x, int __y) { return __stlp_ldexp(__x, __y); }
    414 #  endif
    415 #endif
    416 
    417 /* MSVC native lib starting with .Net 2003 has already all math functions
    418  * in global namespace.
    419  * HP-UX native lib has math functions in the global namespace.
    420  */
    421 #if (!defined (_STLP_MSVC_LIB) || (_STLP_MSVC_LIB < 1310) || defined(UNDER_CE)) && \
    422     (!defined (__HP_aCC) || (__HP_aCC < 30000)) && \
    423     !defined (__WATCOMC__)
    424 inline double abs(double __x)
    425 { return ::fabs(__x); }
    426 #  if !defined (__MVS__)
    427 _STLP_DEF_MATH_INLINE(abs, fabs)
    428 #  else // __MVS__ has native long double abs?
    429 inline float abs(float __x) { return ::fabsf(__x); }
    430 #  endif
    431 
    432 _STLP_DEF_MATH_INLINE(acos, acos)
    433 _STLP_DEF_MATH_INLINE(asin, asin)
    434 _STLP_DEF_MATH_INLINE(atan, atan)
    435 _STLP_DEF_MATH_INLINE2(atan2, atan2)
    436 _STLP_DEF_MATH_INLINE(ceil, ceil)
    437 _STLP_DEF_MATH_INLINE(cos, cos)
    438 _STLP_DEF_MATH_INLINE(cosh, cosh)
    439 _STLP_DEF_MATH_INLINE(exp, exp)
    440 _STLP_DEF_MATH_INLINE(fabs, fabs)
    441 _STLP_DEF_MATH_INLINE(floor, floor)
    442 _STLP_DEF_MATH_INLINE2(fmod, fmod)
    443 _STLP_DEF_MATH_INLINE2PI(frexp, frexp)
    444 _STLP_DEF_MATH_INLINE2I(ldexp, ldexp)
    445 _STLP_DEF_MATH_INLINE(log, log)
    446 _STLP_DEF_MATH_INLINE(log10, log10)
    447 _STLP_DEF_MATH_INLINE2P(modf, modf)
    448 _STLP_DEF_MATH_INLINE(sin, sin)
    449 _STLP_DEF_MATH_INLINE(sinh, sinh)
    450 _STLP_DEF_MATH_INLINE(sqrt, sqrt)
    451 _STLP_DEF_MATH_INLINE(tan, tan)
    452 _STLP_DEF_MATH_INLINE(tanh, tanh)
    453 _STLP_DEF_MATH_INLINE2(pow, pow)
    454 
    455 #  if !defined(_STLP_MSVC) /* || (_STLP_MSVC > 1300) */ || defined(_STLP_WCE) || !defined (_MSC_EXTENSIONS) /* && !defined(_STLP_WCE_NET) */
    456 #    ifndef _STLP_NO_VENDOR_MATH_F
    457 #      ifndef __sun
    458 inline float pow(float __x, int __y) { return _STLP_CMATH_FUNC_NAMESPACE::powf(__x, __STATIC_CAST(float,__y)); }
    459 #      else
    460 inline float pow(float __x, int __y) { return ::__powf(__x, __STATIC_CAST(float,__y)); }
    461 #      endif
    462 #    else
    463 inline float pow(float __x, int __y) { return __STATIC_CAST(float, _STLP_CMATH_FUNC_NAMESPACE::pow(__x, __STATIC_CAST(float,__y))); }
    464 #    endif
    465 inline double pow(double __x, int __y) { return _STLP_CMATH_FUNC_NAMESPACE::pow(__x, __STATIC_CAST(double,__y)); }
    466 #    if !defined (_STLP_NO_LONG_DOUBLE)
    467 #      if !defined(_STLP_NO_VENDOR_MATH_L)
    468 #        ifndef __sun
    469 inline long double pow(long double __x, int __y) { return _STLP_CMATH_FUNC_NAMESPACE::powl(__x, __STATIC_CAST(long double,__y)); }
    470 #        else
    471 #          ifndef __SUNPRO_CC
    472 inline long double pow(long double __x, int __y) { return ::__powl(__x, __STATIC_CAST(long double,__y)); }
    473 #          else
    474 inline long double pow(long double __x, int __y) { return _STLP_VENDOR_CSTD::__powl(__x, __STATIC_CAST(long double,__y)); }
    475 #          endif
    476 #        endif
    477 #      else
    478 inline long double pow(long double __x, int __y) { return __STATIC_CAST(long double, _STLP_CMATH_FUNC_NAMESPACE::pow(__x, __STATIC_CAST(long double,__y))); }
    479 #      endif
    480 #    endif
    481 #  else
    482 //The MS native pow version has a bugged overload so it is not imported
    483 //in the STLport namespace.
    484 //Here is the bugged version:
    485 //inline double pow(int __x, int __y)            { return (_Pow_int(__x, __y)); }
    486 inline double      pow(double __x, int __y)      { return (_Pow_int(__x, __y)); }
    487 inline float       pow(float __x, int __y)       { return (_Pow_int(__x, __y)); }
    488 inline long double pow(long double __x, int __y) { return (_Pow_int(__x, __y)); }
    489 #  endif
    490 #endif
    491 
    492 #if (defined (_STLP_MSVC) && !defined (_STLP_WCE)) || defined (__ICL) || defined (__sun)
    493 #  if defined (_STLP_MSVC) && (_STLP_MSVC >= 1400)
    494 #    pragma warning (push)
    495 #    pragma warning (disable : 4996) // hypot is deprecated.
    496 #  endif
    497 _STLP_MATH_INLINE2XX(float, hypot, hypot)
    498 inline long double hypot(long double x, long double y) { return sqrt(x * x + y * y); }
    499 #  if defined (_STLP_MSVC) && (_STLP_MSVC >= 1400)
    500 #    pragma warning (pop)
    501 #  endif
    502 #else
    503 #  if defined (_STLP_USE_UCLIBC)
    504 inline double hypot(double x, double y) { return sqrt(x * x + y * y); }
    505 _STLP_DEF_MATH_INLINE2(hypot, hypot)
    506 #  elif defined (_STLP_WCE)
    507    /* CE has a double _hypot(double,double) which we use */
    508 inline double hypot(double __x, double __y) { return _hypot(__x,__y); }
    509 _STLP_DEF_MATH_INLINE2(hypot, _hypot)
    510 #  endif
    511 #endif
    512 
    513 #if defined (_STLP_RESTORE_FUNCTION_INTRINSIC)
    514 //restoration of the default intrinsic status of those functions:
    515 #  pragma intrinsic (abs, acos, asin, atan, atan2, cos, cosh, exp, fabs, fmod, log, log10, sin, sinh, sqrt, tan, tanh)
    516 #  if defined (_STLP_WCE)
    517 #    pragma intrinsic (ceil, floor)
    518 #  endif
    519 #  pragma warning(pop)
    520 #  undef _STLP_RESTORE_FUNCTION_INTRINSIC
    521 #endif // _STLP_MSVC && _STLP_MSVC <= 1300 && !_STLP_WCE && _MSC_EXTENSIONS
    522 
    523 /* C++ Standard is unclear about several call to 'using ::func' if new overloads
    524  * of ::func appears between 2 successive 'using' calls. To avoid this potential
    525  * problem we provide all abs overload before the 'using' call.
    526  * Beware: This header inclusion has to be after all abs overload of this file.
    527  *         The first 'using ::abs' call is going to be in the other header.
    528  */
    529 #ifndef _STLP_INTERNAL_CSTDLIB
    530 #  include <stl/_cstdlib.h>
    531 #endif
    532 
    533 #if defined (_STLP_IMPORT_VENDOR_CSTD) && !defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
    534 #if defined (__ANDROID__)
    535 namespace __captured {
    536 template<typename _Tp> inline int __capture_isfinite(_Tp __f) { return isfinite(__f); }
    537 template<typename _Tp> inline int __capture_isinf(_Tp __f) { return isinf(__f); }
    538 template<typename _Tp> inline int __capture_isnan(_Tp __f) { return isnan(__f); }
    539 template<typename _Tp> inline int __capture_signbit(_Tp __f) { return signbit(__f); }
    540 }
    541 #undef isfinite
    542 #undef isinf
    543 #undef isnan
    544 #undef signbit
    545 namespace __captured {
    546 template<typename _Tp> inline int isfinite(_Tp __f) { return __capture_isfinite(__f); }
    547 template<typename _Tp> inline int isinf(_Tp __f) { return __capture_isinf(__f); }
    548 template<typename _Tp> inline int isnan(_Tp __f) { return __capture_isnan(__f); }
    549 template<typename _Tp> inline int signbit(_Tp __f) { return __capture_signbit(__f); }
    550 }
    551 #endif
    552 _STLP_BEGIN_NAMESPACE
    553 using ::abs;
    554 using ::acos;
    555 using ::asin;
    556 using ::atan;
    557 using ::atan2;
    558 using ::ceil;
    559 using ::cos;
    560 using ::cosh;
    561 using ::exp;
    562 using ::fabs;
    563 using ::floor;
    564 using ::fmod;
    565 using ::frexp;
    566 /*
    567    Because of some weird interaction between STLport headers
    568    and native HP-UX headers, when compiled with _STLP_DEBUG
    569    macro defined with aC++, hypot() is not declared.
    570    At some point we'll need to get to the bottom line of
    571    this problem.
    572 */
    573 #if !(defined(__HP_aCC) && defined(_STLP_DEBUG))
    574 using ::hypot;
    575 #endif
    576 #if defined (__ANDROID__)
    577 using __captured::isfinite;
    578 using __captured::isinf;
    579 using __captured::isnan;
    580 #endif
    581 using ::ldexp;
    582 using ::log;
    583 using ::log10;
    584 using ::modf;
    585 using ::pow;
    586 #if defined (__ANDROID__)
    587 using __captured::signbit;
    588 #endif
    589 using ::sin;
    590 using ::sinh;
    591 using ::sqrt;
    592 using ::tan;
    593 using ::tanh;
    594 _STLP_END_NAMESPACE
    595 #  if defined (__BORLANDC__) && (__BORLANDC__ >= 0x560) && !defined (__linux__)
    596 using _STLP_VENDOR_CSTD::_ecvt;
    597 using _STLP_VENDOR_CSTD::_fcvt;
    598 #  endif
    599 #endif
    600 
    601 #endif /* _STLP_INTERNAL_CMATH */
    602 
    603 // Local Variables:
    604 // mode:C++
    605 // End:
    606