mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
	
	
		
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | 
 | ||
|  | /** nonfinite_num_facet_trap.cpp
 | ||
|  | * | ||
|  | * Copyright (c) 2012 Paul A. Bristow | ||
|  | * | ||
|  | * 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)
 | ||
|  | * | ||
|  | * This very simple program illustrates how to use the | ||
|  | * `boost/math/nonfinite_num_facets.hpp` trapping output of infinity and/or NaNs. | ||
|  | * | ||
|  | \file | ||
|  | 
 | ||
|  | \brief A very simple example of using non_finite_num facet for | ||
|  | trapping output of infinity and/or NaNs. | ||
|  | 
 | ||
|  | \note To actually get an exception throw by the iostream library | ||
|  | one must enable exceptions. | ||
|  |   `oss.exceptions(std::ios_base::failbit | std::ios_base::badbit);` | ||
|  | \note Which bit is set is implementation dependent, so enable exceptions for both. | ||
|  | 
 | ||
|  | This is a fairly brutal method of catching nonfinites on output, | ||
|  | but may suit some applications. | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | #ifdef _MSC_VER
 | ||
|  | #   pragma warning(disable : 4127) // conditional expression is constant.
 | ||
|  | // assumes C++ exceptions enabled /EHsc
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include <boost/cstdint.hpp>
 | ||
|  | #include <boost/math/special_functions/nonfinite_num_facets.hpp>
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | #include <iomanip>
 | ||
|  | using std::cout; | ||
|  | using std::endl; | ||
|  | using std::hex; | ||
|  | #include <exception>
 | ||
|  | #include <limits> // numeric_limits
 | ||
|  | using std::numeric_limits; | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |   using namespace boost::math; | ||
|  | 
 | ||
|  |   std::cout << "nonfinite_num_facet_trap.cpp" << std::endl; | ||
|  | 
 | ||
|  |   const double inf = +std::numeric_limits<double>::infinity (); | ||
|  |   const double nan = +std::numeric_limits<double>::quiet_NaN (); | ||
|  | 
 | ||
|  |   { // Output infinity and NaN with default flags (no trapping).
 | ||
|  |     std::ostringstream oss; | ||
|  |     std::locale default_locale (std::locale::classic ()); | ||
|  |     std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>); | ||
|  |     oss.imbue (C99_out_locale); | ||
|  |     oss.exceptions(std::ios_base::failbit | std::ios_base::badbit); | ||
|  |     oss << inf <<  ' ' << nan; | ||
|  |     cout << "oss.rdstate()  = " << hex << oss.rdstate() << endl; // 0
 | ||
|  |     cout << "os.str() = " << oss.str() << endl; // os.str() = inf nan
 | ||
|  |   } | ||
|  | 
 | ||
|  |   try | ||
|  |   { // // Output infinity with flags set to trap and catch any infinity.
 | ||
|  |     std::ostringstream oss; | ||
|  |     std::locale default_locale (std::locale::classic ()); | ||
|  |     std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>(trap_infinity)); | ||
|  |     oss.imbue (C99_out_locale); | ||
|  |     oss.exceptions(std::ios_base::failbit | std::ios_base::badbit); | ||
|  |     // Note that which bit is set is implementation dependent, so enable exceptions for both.
 | ||
|  |     oss << inf; | ||
|  |     cout << "oss.rdstate()  = " << hex << oss.rdstate() << endl; | ||
|  |     cout << "oss.str() = " << oss.str() << endl; | ||
|  |   } | ||
|  |   catch(const std::ios_base::failure& e) | ||
|  |   { // Expect "Infinity".
 | ||
|  |     std::cout << "\n""Message from thrown exception was: " << e.what() << std::endl; | ||
|  |   } | ||
|  | 
 | ||
|  |   try | ||
|  |   { // // Output NaN with flags set to catch any NaNs.
 | ||
|  |     std::ostringstream oss; | ||
|  |     std::locale default_locale (std::locale::classic ()); | ||
|  |     std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>(trap_nan)); | ||
|  |     oss.imbue (C99_out_locale); | ||
|  |     oss.exceptions(std::ios_base::failbit | std::ios_base::badbit); | ||
|  |     // Note that which bit is set is implementation dependent, so enable exceptions for both.
 | ||
|  |     oss << nan; | ||
|  |     cout << "oss.str() = " << oss.str() << endl; | ||
|  |   } | ||
|  |   catch(const std::ios_base::failure& e) | ||
|  |   { // Expect "Infinity".
 | ||
|  |     std::cout << "\n""Message from thrown exception was: " << e.what() << std::endl; | ||
|  |  } | ||
|  | 
 | ||
|  | 
 | ||
|  |   return 0; // end of nonfinite_num_facet_trap.cpp
 | ||
|  | } // int main()
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | 
 | ||
|  | Output: | ||
|  | 
 | ||
|  |   nonfinite_num_facet_trap.cpp | ||
|  |   oss.rdstate()  = 0 | ||
|  |   os.str() = inf nan | ||
|  | 
 | ||
|  |   Message from thrown exception was: Infinity | ||
|  | 
 | ||
|  |   Message from thrown exception was: NaN | ||
|  | 
 | ||
|  | */ |