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