epoc32/include/stdapis/boost/functional/detail/float_functions.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
williamr@2
     2
//  Copyright Daniel James 2005-2006. Use, modification, and distribution are
williamr@2
     3
//  subject to the Boost Software License, Version 1.0. (See accompanying
williamr@2
     4
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     5
/*
williamr@2
     6
 * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
williamr@2
     7
*/
williamr@2
     8
#if !defined(BOOST_FUNCTIONAL_DETAIL_FLOAT_FUNCTIONS_HPP)
williamr@2
     9
#define BOOST_FUNCTIONAL_DETAIL_FLOAT_FUNCTIONS_HPP
williamr@2
    10
williamr@2
    11
#include <cmath>
williamr@2
    12
williamr@2
    13
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
williamr@2
    14
# pragma once
williamr@2
    15
#endif
williamr@2
    16
williamr@2
    17
// The C++ standard requires that the C float functions are overloarded
williamr@2
    18
// for float, double and long double in the std namespace, but some of the older
williamr@2
    19
// library implementations don't support this. On some that don't, the C99
williamr@2
    20
// float functions (frexpf, frexpl, etc.) are available.
williamr@2
    21
//
williamr@2
    22
// Some of this is based on guess work. If I don't know any better I assume that
williamr@2
    23
// the standard C++ overloaded functions are available. If they're not then this
williamr@2
    24
// means that the argument is cast to a double and back, which is inefficient
williamr@2
    25
// and will give pretty bad results for long doubles - so if you know better
williamr@2
    26
// let me know.
williamr@2
    27
williamr@2
    28
// STLport:
williamr@2
    29
#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
williamr@2
    30
#  if (defined(__GNUC__) && __GNUC__ < 3 && (defined(linux) || defined(__linux) || defined(__linux__))) || defined(__DMC__)
williamr@2
    31
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    32
#  elif defined(BOOST_MSVC) && BOOST_MSVC < 1300
williamr@2
    33
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    34
#  else
williamr@2
    35
#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    36
#  endif
williamr@2
    37
williamr@2
    38
// Roguewave:
williamr@2
    39
//
williamr@2
    40
// On borland 5.51, with roguewave 2.1.1 the standard C++ overloads aren't
williamr@2
    41
// defined, but for the same version of roguewave on sunpro they are.
williamr@2
    42
#elif defined(_RWSTD_VER)
williamr@2
    43
#  if defined(__BORLANDC__)
williamr@2
    44
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    45
#    define BOOST_HASH_C99_NO_FLOAT_FUNCS
williamr@2
    46
#  elif defined(__DECCXX)
williamr@2
    47
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    48
#  else
williamr@2
    49
#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    50
#  endif
williamr@2
    51
williamr@2
    52
// libstdc++ (gcc 3.0 onwards, I think)
williamr@2
    53
#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
williamr@2
    54
#  define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    55
williamr@2
    56
// SGI:
williamr@2
    57
#elif defined(__STL_CONFIG_H)
williamr@2
    58
#  if defined(linux) || defined(__linux) || defined(__linux__)
williamr@2
    59
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    60
#  else
williamr@2
    61
#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    62
#  endif
williamr@2
    63
williamr@2
    64
// Dinkumware.
williamr@2
    65
#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
williamr@2
    66
// Overloaded float functions were probably introduced in an earlier version
williamr@2
    67
// than this.
williamr@2
    68
#  if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 402)
williamr@2
    69
#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    70
#  else
williamr@2
    71
#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    72
#  endif
williamr@2
    73
williamr@2
    74
// Digital Mars
williamr@2
    75
#elif defined(__DMC__)
williamr@2
    76
#  define BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
    77
williamr@2
    78
// Use overloaded float functions by default.
williamr@2
    79
#else
williamr@2
    80
#  define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
    81
#endif
williamr@2
    82
williamr@2
    83
namespace boost
williamr@2
    84
{
williamr@2
    85
    namespace hash_detail
williamr@2
    86
    {
williamr@2
    87
williamr@2
    88
        inline float call_ldexp(float v, int exp)
williamr@2
    89
        {
williamr@2
    90
            using namespace std;
williamr@2
    91
#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS) || \
williamr@2
    92
    defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
williamr@2
    93
            return ldexp(v, exp);
williamr@2
    94
#else
williamr@2
    95
            return ldexpf(v, exp);
williamr@2
    96
#endif
williamr@2
    97
        }
williamr@2
    98
williamr@2
    99
        inline double call_ldexp(double v, int exp)
williamr@2
   100
        {
williamr@2
   101
            using namespace std;
williamr@2
   102
            return ldexp(v, exp);
williamr@2
   103
        }
williamr@2
   104
williamr@2
   105
#ifndef __SYMBIAN32__
williamr@2
   106
        inline long double call_ldexp(long double v, int exp)
williamr@2
   107
        {
williamr@2
   108
            using namespace std;
williamr@2
   109
#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
williamr@2
   110
            return ldexp(v, exp);
williamr@2
   111
#else
williamr@2
   112
            return ldexpl(v, exp);
williamr@2
   113
#endif
williamr@2
   114
        }
williamr@2
   115
#endif
williamr@2
   116
williamr@2
   117
        inline float call_frexp(float v, int* exp)
williamr@2
   118
        {
williamr@2
   119
            using namespace std;
williamr@2
   120
#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS) || \
williamr@2
   121
    defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
williamr@2
   122
            return frexp(v, exp);
williamr@2
   123
#else
williamr@2
   124
            return frexpf(v, exp);
williamr@2
   125
#endif
williamr@2
   126
        }
williamr@2
   127
williamr@2
   128
        inline double call_frexp(double v, int* exp)
williamr@2
   129
        {
williamr@2
   130
            using namespace std;
williamr@2
   131
            return frexp(v, exp);
williamr@2
   132
        }
williamr@2
   133
williamr@2
   134
williamr@2
   135
#ifndef __SYMBIAN32__
williamr@2
   136
        inline long double call_frexp(long double v, int* exp)
williamr@2
   137
        {
williamr@2
   138
            using namespace std;
williamr@2
   139
#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
williamr@2
   140
            return frexp(v, exp);
williamr@2
   141
#else
williamr@2
   142
            return frexpl(v, exp);
williamr@2
   143
#endif
williamr@2
   144
        }
williamr@2
   145
#endif        
williamr@2
   146
    }
williamr@2
   147
}
williamr@2
   148
williamr@2
   149
#if defined(BOOST_HASH_USE_C99_FLOAT_FUNCS)
williamr@2
   150
#undef BOOST_HASH_USE_C99_FLOAT_FUNCS
williamr@2
   151
#endif
williamr@2
   152
williamr@2
   153
#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
williamr@2
   154
#undef BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
williamr@2
   155
#endif
williamr@2
   156
williamr@2
   157
#if defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
williamr@2
   158
#undef BOOST_HASH_C99_NO_FLOAT_FUNCS
williamr@2
   159
#endif
williamr@2
   160
williamr@2
   161
#endif