Blame view

3rdparty/boost_1_81_0/boost/detail/fenv.hpp 3.13 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  /*=============================================================================
      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 */