102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/*=============================================================================
							 | 
						||
| 
								 | 
							
								    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 */
							 |