mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-28 11:30:25 -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
 | |
| 
 | |
| */
 |