123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- [/
- 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]
|