123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /*=============================================================================
- Copyright (c) 2010 Bryce Lelbach
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #include <boost/config.hpp>
- #if defined(BOOST_NO_FENV_H)
- #error This platform does not have a floating point environment
- #endif
- #if !defined(BOOST_DETAIL_FENV_HPP)
- #define BOOST_DETAIL_FENV_HPP
- /* If we're using clang + glibc, we have to get hacky.
- * See http://llvm.org/bugs/show_bug.cgi?id=6907 */
- #if defined(__clang__) && (__clang_major__ < 3) && \
- defined(__GNU_LIBRARY__) && /* up to version 5 */ \
- defined(__GLIBC__) && /* version 6 + */ \
- !defined(_FENV_H)
- #define _FENV_H
- #include <features.h>
- #include <bits/fenv.h>
- extern "C" {
- extern int fegetexceptflag (fexcept_t*, int) __THROW;
- extern int fesetexceptflag (__const fexcept_t*, int) __THROW;
- extern int feclearexcept (int) __THROW;
- extern int feraiseexcept (int) __THROW;
- extern int fetestexcept (int) __THROW;
- extern int fegetround (void) __THROW;
- extern int fesetround (int) __THROW;
- extern int fegetenv (fenv_t*) __THROW;
- extern int fesetenv (__const fenv_t*) __THROW;
- extern int feupdateenv (__const fenv_t*) __THROW;
- extern int feholdexcept (fenv_t*) __THROW;
- #ifdef __USE_GNU
- extern int feenableexcept (int) __THROW;
- extern int fedisableexcept (int) __THROW;
- extern int fegetexcept (void) __THROW;
- #endif
- }
- namespace std { namespace tr1 {
- using ::fenv_t;
- using ::fexcept_t;
- using ::fegetexceptflag;
- using ::fesetexceptflag;
- using ::feclearexcept;
- using ::feraiseexcept;
- using ::fetestexcept;
- using ::fegetround;
- using ::fesetround;
- using ::fegetenv;
- using ::fesetenv;
- using ::feupdateenv;
- using ::feholdexcept;
- } }
- #elif defined(__MINGW32__) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
- // MinGW (32-bit) has a bug in mingw32/bits/c++config.h, it does not define _GLIBCXX_HAVE_FENV_H,
- // which prevents the C fenv.h header contents to be included in the C++ wrapper header fenv.h. This is at least
- // the case with gcc 4.8.1 packages tested so far, up to 4.8.1-4. Note that there is no issue with
- // MinGW-w64.
- // To work around the bug we avoid including the C++ wrapper header and include the C header directly
- // and import all relevant symbols into std:: ourselves.
- #include <../include/fenv.h>
- namespace std {
- using ::fenv_t;
- using ::fexcept_t;
- using ::fegetexceptflag;
- using ::fesetexceptflag;
- using ::feclearexcept;
- using ::feraiseexcept;
- using ::fetestexcept;
- using ::fegetround;
- using ::fesetround;
- using ::fegetenv;
- using ::fesetenv;
- using ::feupdateenv;
- using ::feholdexcept;
- }
- #else /* if we're not using GNU's C stdlib, fenv.h should work with clang */
- #if defined(__SUNPRO_CC) /* lol suncc */
- #include <stdio.h>
- #endif
- #include <fenv.h>
- #endif
- #endif /* BOOST_DETAIL_FENV_HPP */
|