mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			137 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			137 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								/** nonfinite_serialization_archives.cpp
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* Copyright (c) 2011 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' to obtain C99
							 | 
						||
| 
								 | 
							
								* representation of infinity and NaN.
							 | 
						||
| 
								 | 
							
								* From the original Floating Point  Utilities contribution by Johan Rade.
							 | 
						||
| 
								 | 
							
								* Floating Point Utility library has been accepted into Boost,
							 | 
						||
| 
								 | 
							
								* but the utilities are incorporated into Boost.Math library.
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								\file
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\brief A simple example of using non_finite_num facet for
							 | 
						||
| 
								 | 
							
								C99 standard output of infinity and NaN in serialization archives.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\detail This example shows how to create a C99 non-finite locale,
							 | 
						||
| 
								 | 
							
								and imbue input and output streams with the non_finite_num put and get facets.
							 | 
						||
| 
								 | 
							
								This allow output and input of infinity and NaN in a Standard portable way,
							 | 
						||
| 
								 | 
							
								This permits 'loop-back' of output back into input (and portably across different system too).
							 | 
						||
| 
								 | 
							
								This is particularly useful when used with Boost.Seralization so that non-finite NaNs and infinity
							 | 
						||
| 
								 | 
							
								values in text and xml archives can be handled correctly and portably.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								#   pragma warning(disable : 4127) // conditional expression is constant.
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/archive/text_oarchive.hpp>
							 | 
						||
| 
								 | 
							
								using boost::archive::text_oarchive;
							 | 
						||
| 
								 | 
							
								#include <boost/archive/codecvt_null.hpp>
							 | 
						||
| 
								 | 
							
								using boost::archive::codecvt_null;
							 | 
						||
| 
								 | 
							
								using boost::archive::no_codecvt;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/math/special_functions/nonfinite_num_facets.hpp>
							 | 
						||
| 
								 | 
							
								using boost::math::nonfinite_num_get;
							 | 
						||
| 
								 | 
							
								using boost::math::nonfinite_num_put;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								using std::cout;
							 | 
						||
| 
								 | 
							
								using std::endl;
							 | 
						||
| 
								 | 
							
								using std::cerr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iomanip>
							 | 
						||
| 
								 | 
							
								using std::setw;
							 | 
						||
| 
								 | 
							
								using std::left;
							 | 
						||
| 
								 | 
							
								using std::right;
							 | 
						||
| 
								 | 
							
								using std::internal;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <string>
							 | 
						||
| 
								 | 
							
								using std::string;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								using std::istringstream;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <fstream>
							 | 
						||
| 
								 | 
							
								using std::ofstream;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <limits>
							 | 
						||
| 
								 | 
							
								using std::numeric_limits;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <locale>
							 | 
						||
| 
								 | 
							
								using std::locale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								Use with serialization archives.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It is important that the same locale is used
							 | 
						||
| 
								 | 
							
								when an archive is saved and when it is loaded.
							 | 
						||
| 
								 | 
							
								Otherwise, loading the archive may fail.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								By default, archives are saved and loaded with a classic C locale with a
							 | 
						||
| 
								 | 
							
								`boost::archive::codecvt_null` facet added.
							 | 
						||
| 
								 | 
							
								Normally you do not have to worry about that.
							 | 
						||
| 
								 | 
							
								The constructors for the archive classes, as a side-effect, 
							 | 
						||
| 
								 | 
							
								imbue the stream with such a locale.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								However, if you want to use the facets `nonfinite_num_put` and `nonfinite_num_get`
							 | 
						||
| 
								 | 
							
								with archives,`then you have to manage the locale manually.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								That is done by calling the archive constructor with the flag `boost::archive::no_codecvt`.
							 | 
						||
| 
								 | 
							
								Then the archive constructor will not imbue the stream with a new locale.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following code shows how to use `nonfinite_num_put` with a `text_oarchive`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if((std::numeric_limits<double>::has_infinity == false) || (std::numeric_limits<double>::infinity() == 0))
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::cout << "Infinity not supported on this platform." << std::endl;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if((std::numeric_limits<double>::has_quiet_NaN == false) || (std::numeric_limits<double>::quiet_NaN() == 0))
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    std::cout << "NaN not supported on this platform." << std::endl;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  locale default_locale(locale::classic(), new boost::archive::codecvt_null<char>);
							 | 
						||
| 
								 | 
							
								  // codecvt_null so the archive constructor will not imbue the stream with a new locale.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  locale my_locale(default_locale, new nonfinite_num_put<char>);
							 | 
						||
| 
								 | 
							
								  // Add nonfinite_num_put facet to locale. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ofstream ofs("test.txt");
							 | 
						||
| 
								 | 
							
								  ofs.imbue(my_locale); 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  boost::archive::text_oarchive oa(ofs, no_codecvt);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  double x = numeric_limits<double>::infinity();
							 | 
						||
| 
								 | 
							
								  oa & x;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // int main()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* The same method works with nonfinite_num_get  and text_iarchive.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you use the trap_infinity and trap_nan flags with a serialization archive,
							 | 
						||
| 
								 | 
							
								then you must set the exception mask of the stream.
							 | 
						||
| 
								 | 
							
								Serialization archives do not check the stream state.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 |