mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			312 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			312 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								[/
							 | 
						||
| 
								 | 
							
								    Boost.Optional
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    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)
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section Numeric Converter Policy Classes]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section enum range_check_result]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost { namespace numeric {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        enum range_check_result
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            cInRange     ,
							 | 
						||
| 
								 | 
							
								            cNegOverflow ,
							 | 
						||
| 
								 | 
							
								            cPosOverflow
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Defines the values returned by `boost::numeric::converter<>::out_of_range()`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section Policy OverflowHandler]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This ['stateless] non-template policy class must be a ['function object] and is
							 | 
						||
| 
								 | 
							
								called to administrate the result of the range checking. It can throw an exception
							 | 
						||
| 
								 | 
							
								if overflow has been detected by the range checking as indicated by its argument.
							 | 
						||
| 
								 | 
							
								If it throws, is is recommended that it be `std::bad_cast` or derived.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It must have the following interface (it does not has to be a template class):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct YourOverflowHandlerPolicy
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        void operator() ( boost::range_check_result ) ; // throw bad_cast or derived
							 | 
						||
| 
								 | 
							
								    } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It is called with the result of the converter's `out_of_range()` inside `validate_range()`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These are the two overflow handler classes provided by the library:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost { namespace numeric {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        struct def_overflow_handler
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            void operator() ( range_check_result r ) // throw bad_numeric_conversion derived
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if ( r == cNegOverflow )
							 | 
						||
| 
								 | 
							
								                    throw negative_overflow() ;
							 | 
						||
| 
								 | 
							
								                else if ( r == cPosOverflow )
							 | 
						||
| 
								 | 
							
								                    throw positive_overflow() ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        struct silent_overflow_handler
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            void operator() ( range_check_result ) // no-throw
							 | 
						||
| 
								 | 
							
								            {}
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								And these are the Exception Classes thrown by the default overflow handler
							 | 
						||
| 
								 | 
							
								[link numeric_conversion_policy_overflow_handler_important_note (see IMPORTANT note)]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost { namespace numeric {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ``[#numeric_conversion_bad_numeric_cast]``
							 | 
						||
| 
								 | 
							
								        class bad_numeric_cast : public std::bad_cast
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            public:
							 | 
						||
| 
								 | 
							
								            virtual const char *what() const // throw()
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return "bad numeric conversion: overflow";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ``[#numeric_conversion_negative_overflow]``
							 | 
						||
| 
								 | 
							
								        class negative_overflow : public bad_numeric_cast
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            public:
							 | 
						||
| 
								 | 
							
								            virtual const char *what() const // throw()
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return "bad numeric conversion: negative overflow";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ``[#numeric_conversion_possitive_overflow]``
							 | 
						||
| 
								 | 
							
								        class positive_overflow : public bad_numeric_cast
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            public:
							 | 
						||
| 
								 | 
							
								            virtual const char *what() const // throw()
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return "bad numeric conversion: positive overflow";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[#numeric_conversion_policy_overflow_handler_important_note]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[important [*RELEASE NOTE for 1.33]
							 | 
						||
| 
								 | 
							
								Previous to boost version 1.33, the exception class `bad_numeric_cast` was
							 | 
						||
| 
								 | 
							
								named `bad_numeric_conversion`. However, in 1.33, the old function
							 | 
						||
| 
								 | 
							
								`numeric_cast<>` from `boost/cast.hpp` was completly replaced by the
							 | 
						||
| 
								 | 
							
								new `numeric_cast<>` in `boost/numeric/conversion/cast.hpp`
							 | 
						||
| 
								 | 
							
								(and `boost/cast.hpp` is including `boost/numeric/conversion/cast.hpp` now).
							 | 
						||
| 
								 | 
							
								That old function which existed in boost for quite some time used the
							 | 
						||
| 
								 | 
							
								`bad_numeric_cast` as its exception type so I decided to avoid backward
							 | 
						||
| 
								 | 
							
								compatibility problems by adopting it (guessing that the user base for
							 | 
						||
| 
								 | 
							
								the old code is wider than for the new code).
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section Policy Float2IntRounder]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This ['stateless] template policy class specifies the rounding mode used
							 | 
						||
| 
								 | 
							
								for [_float to integral] conversions. It supplies the `nearbyint()`
							 | 
						||
| 
								 | 
							
								static member function exposed by the converter, which means that it
							 | 
						||
| 
								 | 
							
								[_publicly inherits from this policy].
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The policy must have the following interface:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class S>
							 | 
						||
| 
								 | 
							
								    struct YourFloat2IntRounderPolicy
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        typedef S               source_type ;
							 | 
						||
| 
								 | 
							
								        typedef {S or S const&} argument_type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        static source_type nearbyint ( argument_type s ) { ... }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        typedef mpl::integral_c<std::float_round_style,std::round_...> round_style ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								These are the rounder classes provided by the library (only the specific parts are shown,
							 | 
						||
| 
								 | 
							
								see the general policy form above)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[note
							 | 
						||
| 
								 | 
							
								These classes are not intended to be general purpose rounding functions
							 | 
						||
| 
								 | 
							
								but specific policies for `converter<>`. This is why they are not function objects.
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost { namespace numeric {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class S>
							 | 
						||
| 
								 | 
							
								        struct Trunc
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            static source_type nearbyint ( argument_type s )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using std::floor ;
							 | 
						||
| 
								 | 
							
								                using std::ceil  ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                return s >= static_cast<S>(0) ? floor(s) : ceil(s) ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef mpl::integral_c<std::float_round_style,std::round_toward_zero> round_style ;
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class S>
							 | 
						||
| 
								 | 
							
								        struct RoundEven
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            static source_type nearbyint ( argument_type s )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return impl-defined-value ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef mpl::integral_c<std::float_round_style,std::round_to_nearest> round_style ;
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class S>
							 | 
						||
| 
								 | 
							
								        struct Ceil
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            static source_type nearbyint ( argument_type s )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using std::ceil ;
							 | 
						||
| 
								 | 
							
								                return ceil(s) ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef mpl::integral_c<std::float_round_style,std::round_toward_infinity> round_style ;
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class S>
							 | 
						||
| 
								 | 
							
								        struct Floor
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            static source_type nearbyint ( argument_type s )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                using std::floor ;
							 | 
						||
| 
								 | 
							
								                return floor(s) ;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            typedef mpl::integral_c<std::float_round_style,std::round_toward_neg_infinity> round_style ;
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } } // namespace numeric, namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[heading Math Functions used by the rounder policies]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The rounder policies supplied by this header use math functions `floor()` and `ceil()`.
							 | 
						||
| 
								 | 
							
								The standard versions of these functions are introduced in context by a using directive,
							 | 
						||
| 
								 | 
							
								so in normal conditions, the standard functions will be used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								However, if there are other visible corresponding overloads an ambiguity could arise.
							 | 
						||
| 
								 | 
							
								In this case, the user can supply her own rounder policy which could, for instance,
							 | 
						||
| 
								 | 
							
								use a fully qualified call.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This technique allows the default rounder policies to be used directly with
							 | 
						||
| 
								 | 
							
								user defined types. The user only requires that suitable overloads of `floor()` and `ceil()`
							 | 
						||
| 
								 | 
							
								be visible. See also [link boost_numericconversion.type_requirements_and_user_defined_types_support User Defined Numeric Types]
							 | 
						||
| 
								 | 
							
								support.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section Policy RawConverter]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This ['stateless] template policy class is used to perform the 
							 | 
						||
| 
								 | 
							
								actual conversion from Source to Target. It supplies the 
							 | 
						||
| 
								 | 
							
								`low_level_convert()` static member function exposed by the 
							 | 
						||
| 
								 | 
							
								converter, which means that it publicly inherits from this policy.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The policy must have the following interface:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class Traits>
							 | 
						||
| 
								 | 
							
								    struct YourRawConverterPolicy
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        typedef typename Traits::result_type   result_type   ;
							 | 
						||
| 
								 | 
							
								        typedef typename Traits::argument_type argument_type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        static result_type low_level_convert ( argument_type s ) { return <impl defined> ; }
							 | 
						||
| 
								 | 
							
								    } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This policy is mostly provided as a hook for user defined types which don't support `static_cast<>` conversions to some types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This is the only raw converter policy class provided by the library:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    namespace boost { namespace numeric {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class Traits>
							 | 
						||
| 
								 | 
							
								        struct raw_numeric_converter
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef typename Traits::result_type   result_type   ;
							 | 
						||
| 
								 | 
							
								            typedef typename Traits::argument_type argument_type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            static result_type low_level_convert ( argument_type s )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return static_cast<result_type>(s) ; 
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[section Policy UserRangeChecker]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This ['stateless] template policy class is used [_only if supplied] 
							 | 
						||
| 
								 | 
							
								to [*override] the internal range checking logic.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								It supplies the `validate_range()` static member function 
							 | 
						||
| 
								 | 
							
								exposed by the converter, which means that it publicly inherits 
							 | 
						||
| 
								 | 
							
								from this policy.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The policy must have the following interface:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class Traits>
							 | 
						||
| 
								 | 
							
								    struct YourRangeCheckerPolicy
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        typedef typename Traits::argument_type argument_type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Determines if the value 's' fits in the range of the Target type.
							 | 
						||
| 
								 | 
							
								        static range_check_result out_of_range ( argument_type s ) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // Checks whether the value 's' is out_of_range()
							 | 
						||
| 
								 | 
							
								        // and passes the result of the check to the OverflowHandler policy.
							 | 
						||
| 
								 | 
							
								        static void validate_range ( argument_type s )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            OverflowHandler()( out_of_range(s) ) ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This policy is [*only] provided as a hook for user defined types which require
							 | 
						||
| 
								 | 
							
								range checking (which is disabled by default when a UDT is involved).
							 | 
						||
| 
								 | 
							
								The library provides a class: `UseInternalRangeChecker{}`; which is a ['fake]
							 | 
						||
| 
								 | 
							
								`RangeChecker` policy used to signal the converter to use its internal
							 | 
						||
| 
								 | 
							
								range checking implementation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[endsect]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |