mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
	
	
		
			273 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			273 lines
		
	
	
		
			8.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 conversion_traits<> traits class] | ||
|  | 
 | ||
|  | [section Types] | ||
|  | 
 | ||
|  | [section enumeration int_float_mixture_enum] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         enum int_float_mixture_enum | ||
|  |         { | ||
|  |            integral_to_integral | ||
|  |           ,integral_to_float | ||
|  |           ,float_to_integral | ||
|  |           ,float_to_float | ||
|  |         } ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section enumeration sign_mixture_enum] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |     enum sign_mixture_enum | ||
|  |     { | ||
|  |        unsigned_to_unsigned | ||
|  |       ,signed_to_signed | ||
|  |       ,signed_to_unsigned | ||
|  |       ,unsigned_to_signed | ||
|  |     } ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section enumeration udt_builtin_mixture_enum] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         enum udt_builtin_mixture_enum | ||
|  |         { | ||
|  |            builtin_to_builtin | ||
|  |           ,builtin_to_udt | ||
|  |           ,udt_to_builtin | ||
|  |           ,udt_to_udt | ||
|  |         } ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section template class int_float_mixture<>] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         template <class T, class S> | ||
|  |         struct int_float_mixture : mpl::integral_c<int_float_mixture_enum, impl-def-value> {} ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | Classifying `S` and `T` as either integral or float, this __MPL_INTEGRAL_CONSTANT__ | ||
|  | indicates the combination of these attributes. | ||
|  | 
 | ||
|  | Its `::value` is of enumeration type | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum `boost::numeric::int_float_mixture_enum`] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section template class sign_mixture<>] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         template <class T, class S> | ||
|  |         struct sign_mixture : mpl::integral_c<sign_mixture_enum, impl-def-value> {} ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | Classifying `S` and `T` as either signed or unsigned, this __MPL_INTEGRAL_CONSTANT__ | ||
|  | indicates the combination of these attributes. | ||
|  | 
 | ||
|  | Its `::value` is of enumeration type | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum `boost::numeric::sign_mixture_enum`] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section template class udt_builtin_mixture<>] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         template <class T, class S> | ||
|  |         struct udt_builtin_mixture : mpl::integral_c<udt_builtin__mixture_enum, impl-def-value> {} ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | Classifying `S` and `T` as either user-defined or builtin, this __MPL_INTEGRAL_CONSTANT__ | ||
|  | indicates the combination of these attributes. | ||
|  | 
 | ||
|  | Its `::value` is of enumeration type | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum `boost::numeric::udt_builtin_mixture_enum`] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section template class is_subranged<>] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         template <class T, class S> | ||
|  |         struct is_subranged : mpl::bool_<impl-def-value> {} ; | ||
|  | 
 | ||
|  |     } } // namespace boost::numeric | ||
|  | 
 | ||
|  | Indicates if the range of the target type `T` is a subset of the range of the source | ||
|  | type `S`. That is: if there are some source values which fall out of the | ||
|  | Target type's range. | ||
|  | 
 | ||
|  | It is a boolean __MPL_INTEGRAL_CONSTANT__. | ||
|  | 
 | ||
|  | It does not indicate if a particular conversion is effectively out of range; | ||
|  | it indicates that some conversion might be out of range because not all the | ||
|  | source values are representable as Target type. | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section template class conversion_traits<>] | ||
|  | 
 | ||
|  |     namespace boost { namespace numeric { | ||
|  | 
 | ||
|  |         template <class T, class S> | ||
|  |         struct conversion_traits | ||
|  |         { | ||
|  |             mpl::integral_c<int_float_mixture_enum  , ...> int_float_mixture ; | ||
|  |             mpl::integral_c<sign_mixture_enum       , ...> sign_mixture; | ||
|  |             mpl::integral_c<udt_builtin_mixture_enum, ...> udt_builtin_mixture ; | ||
|  | 
 | ||
|  |             mpl::bool_<...> subranged ; | ||
|  |             mpl::bool_<...> trivial ; | ||
|  | 
 | ||
|  |             typedef T target_type   ; | ||
|  |             typedef S source_type   ; | ||
|  |             typedef ... argument_type ; | ||
|  |             typedef ... result_type   ; | ||
|  |             typedef ... supertype     ; | ||
|  |             typedef ... subtype       ; | ||
|  |         } ; | ||
|  | 
 | ||
|  |     } } // namespace numeric, namespace boost | ||
|  | 
 | ||
|  | 
 | ||
|  | This traits class indicates some properties of a ['numeric conversion] direction: | ||
|  | from a source type `S` to a target type `T`. It does not indicate the properties | ||
|  | of a ['specific] conversion, but of the conversion direction. See | ||
|  | [link boost_numericconversion.definitions.subranged_conversion_direction__subtype_and_supertype Definitions] for details. | ||
|  | 
 | ||
|  | The traits class provides the following __MPL_INTEGRAL_CONSTANT__\s of enumeration | ||
|  | type. They express the combination of certain attributes of the Source and | ||
|  | Target types (thus they are call mixture): | ||
|  | 
 | ||
|  | [table | ||
|  | [[       ][        ]] | ||
|  | [[[*int_float_mixture   ]][ | ||
|  | Same as given by the traits class | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__ int_float_mixture] | ||
|  | ]] | ||
|  | [[[*sign_mixture        ]][ | ||
|  | Same as given by the traits class | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__ sign_mixture] | ||
|  | ]] | ||
|  | [[[*udt_builtin_mixture ]] | ||
|  | [Same as given by the traits class | ||
|  | [link boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__ udt_builtin_mixture] | ||
|  | ]] | ||
|  | ] | ||
|  | 
 | ||
|  | The traits class provides the following __MPL_INTEGRAL_CONSTANT__\s of boolean type | ||
|  | which indicates indirectly the relation between the Source and Target ranges | ||
|  | (see [link boost_numericconversion.definitions.range_and_precision Definitions] for details). | ||
|  | 
 | ||
|  | [table | ||
|  | [[       ][        ]] | ||
|  | [[subranged ][ | ||
|  | Same as given by [link boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__ is_subranged] | ||
|  | ]] | ||
|  | [[trivial][ | ||
|  | Indicates if both Source and Target, [_without cv-qualifications], are the same type. | ||
|  | 
 | ||
|  | Its `::value` is of boolean type. | ||
|  | ]] | ||
|  | ] | ||
|  | 
 | ||
|  | The traits class provides the following types. They are the Source and Target types classified | ||
|  | and qualified for different purposes. | ||
|  | 
 | ||
|  | 
 | ||
|  | [table | ||
|  | [[            ][         ]] | ||
|  | [[[*target_type]][ | ||
|  | The template parameter `T` without cv-qualifications | ||
|  | ]] | ||
|  | [[[*source_type]][ | ||
|  | The template parameter `S` without cv-qualifications | ||
|  | ]] | ||
|  | [[[*argument_type]][ | ||
|  | This type is either source_type or `source_type const&`. | ||
|  | 
 | ||
|  | It represents the optimal argument type for the | ||
|  | [link boost_numericconversion.converter___function_object converter] member functions. | ||
|  | 
 | ||
|  | If S is a built-in type, this is `source_type`, otherwise, this is `source_type const&`. | ||
|  | ]] | ||
|  | [[[*result_type]][ | ||
|  | This type is either target_type or target_type const& | ||
|  | 
 | ||
|  | It represents the return type of the  | ||
|  | [link boost_numericconversion.converter___function_object converter] member functions. | ||
|  | 
 | ||
|  | If `T==S`, it is `target_type const&`, otherwise, it is `target_type`. | ||
|  | ]] | ||
|  | [[[*supertype]][ | ||
|  | If the conversion is subranged, it is `source_type`, otherwise, it is `target_type` | ||
|  | ]] | ||
|  | [[[*subtype]][ | ||
|  | If the conversion is subranged, it is `target_type`, otherwise, it is `source_type` | ||
|  | ]] | ||
|  | ] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [section Examples] | ||
|  | 
 | ||
|  |     #include <cassert> | ||
|  |     #include <typeinfo> | ||
|  |     #include <boost/numeric/conversion/conversion_traits.hpp> | ||
|  | 
 | ||
|  |     int main() | ||
|  |     { | ||
|  | 
 | ||
|  |         // A trivial conversion. | ||
|  |         typedef boost::numeric::conversion_traits<short,short> Short2Short_Traits ; | ||
|  |         assert ( Short2Short_Traits::trivial::value ) ; | ||
|  | 
 | ||
|  |         // A subranged conversion. | ||
|  |         typedef boost::numeric::conversion_traits<double,unsigned int> UInt2Double_Traits ; | ||
|  |         assert (  UInt2Double_Traits::int_float_mixture::value == boost::numeric::integral_to_float ) ; | ||
|  |         assert (  UInt2Double_Traits::sign_mixture::value == boost::numeric::unsigned_to_signed ) ; | ||
|  |         assert ( !UInt2Double_Traits::subranged::value ) ; | ||
|  |         assert ( typeid(UInt2Double_Traits::supertype) == typeid(double) ) ; | ||
|  |         assert ( typeid(UInt2Double_Traits::subtype) == typeid(unsigned int) ) ; | ||
|  | 
 | ||
|  |         // A doubly subranged conversion. | ||
|  |         assert ( (boost::numeric::conversion_traits<short, unsigned short>::subranged::value) ); | ||
|  |         assert ( (boost::numeric::conversion_traits<unsigned short, short>::subranged::value) ); | ||
|  | 
 | ||
|  |         return 0; | ||
|  |     } | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 | ||
|  | [endsect] | ||
|  | 
 |