mirror of
https://github.com/boostorg/numeric_conversion.git
synced 2026-07-23 13:54:15 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ab5a806137 |
+1
-7
@@ -12,9 +12,6 @@
|
||||
|
||||
import quickbook ;
|
||||
|
||||
path-constant images : html ;
|
||||
|
||||
|
||||
xml conversion
|
||||
:
|
||||
conversion.qbk
|
||||
@@ -25,12 +22,9 @@ boostbook standalone
|
||||
conversion
|
||||
:
|
||||
<xsl:param>boost.root=../../../../..
|
||||
<xsl:param>html.stylesheet=boostbook.css
|
||||
<xsl:param>boost.libraries=../../../../libraries.htm
|
||||
<xsl:param>toc.max.depth=2
|
||||
<xsl:param>toc.section.depth=2
|
||||
<xsl:param>chunk.section.depth=1
|
||||
<format>pdf:<xsl:param>img.src.path=$(images)/
|
||||
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/numeric/conversion/doc/html
|
||||
;
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[#numeric_conversion_bounds]
|
||||
|
||||
[section bounds<> traits class]
|
||||
|
||||
[section Introduction]
|
||||
|
||||
+12
-12
@@ -46,32 +46,32 @@ Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
The Boost Numeric Conversion library is a collection of tools to describe and
|
||||
perform conversions between values of different
|
||||
[link boost_numericconversion.definitions.numeric_types numeric types].
|
||||
[link numeric_conversion_definitions_numeric_types numeric types].
|
||||
|
||||
The library includes a special alternative for a subset of `std::numeric_limits<>`,
|
||||
the [link boost_numericconversion.bounds___traits_class bounds<>] traits class, which provides
|
||||
a consistent way to obtain the [link boost_numericconversion.definitions.range_and_precision boundary]
|
||||
values for the [link boost_numericconversion.definitions.range_and_precision range] of a numeric type.
|
||||
the [link numeric_conversion_bounds bounds<>] traits class, which provides
|
||||
a consistent way to obtain the [link numeric_conversion_definitions_range boundary]
|
||||
values for the [link numeric_conversion_definitions_range range] of a numeric type.
|
||||
|
||||
It also includes a set of [link boost_numericconversion.conversion_traits___traits_class trait classes]
|
||||
It also includes a set of [link numeric_conversion_traits trait classes]
|
||||
which describes the compile-time
|
||||
properties of a conversion from a source to a target numeric type.
|
||||
Both [link boost_numericconversion.definitions.c___arithmetic_types arithmetic] and
|
||||
[link boost_numericconversion.definitions.numeric_types user-defined numeric types] can be used.
|
||||
Both [link numeric_conversion_cpp_arithmetic_types arithmetic] and
|
||||
[link numeric_conversion_definitions_numeric_types user-defined numeric types] can be used.
|
||||
|
||||
A policy-based [link boost_numericconversion.converter___function_object converter] object which
|
||||
A policy-based [link numeric_conversion_converter converter] object which
|
||||
uses `conversion_traits` to select
|
||||
an optimized implementation is supplied. Such implementation uses an optimal
|
||||
range checking code suitable for the source/target combination.
|
||||
|
||||
* The converter's out-of-range behavior can be customized via an
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler OverflowHandler] policy.
|
||||
[link numeric_conversion_policy_overflow_handler OverflowHandler] policy.
|
||||
* For floating-point to integral conversions, the rounding mode can be selected via the
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder Float2IntRounder] policy.
|
||||
[link numeric_conversion_policy_float_to_int_rounder Float2IntRounder] policy.
|
||||
* A custom low-level conversion routine (for UDTs for instance) can be passed via a
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy.
|
||||
[link numeric_conversion_policy_raw_converter RawConverter] policy.
|
||||
* The optimized automatic range-checking logic can be overridden via a
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy.
|
||||
[link numeric_conversion_policy_user_range_checker UserRangeChecker] policy.
|
||||
|
||||
[endsect]
|
||||
|
||||
|
||||
+27
-11
@@ -8,10 +8,14 @@
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[#numeric_conversion_traits]
|
||||
|
||||
[section conversion_traits<> traits class]
|
||||
|
||||
[section Types]
|
||||
|
||||
[#numeric_conversion_traits_int_float_mixture_enum]
|
||||
|
||||
[section enumeration int_float_mixture_enum]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -28,6 +32,8 @@
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_sign_mixture_enum]
|
||||
|
||||
[section enumeration sign_mixture_enum]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -44,6 +50,8 @@
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_udt_builtin_mixture_enum]
|
||||
|
||||
[section enumeration udt_builtin_mixture_enum]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -60,6 +68,8 @@
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_class_int_float_mixture]
|
||||
|
||||
[section template class int_float_mixture<>]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -73,10 +83,12 @@ Classifying `S` and `T` as either integral or float, this __MPL_INTEGRAL_CONSTAN
|
||||
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`]
|
||||
[link numeric_conversion_traits_int_float_mixture_enum `boost::numeric::int_float_mixture_enum`]
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_class_sign_mixture]
|
||||
|
||||
[section template class sign_mixture<>]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -90,10 +102,12 @@ Classifying `S` and `T` as either signed or unsigned, this __MPL_INTEGRAL_CONSTA
|
||||
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`]
|
||||
[link numeric_conversion_traits_sign_mixture_enum `boost::numeric::sign_mixture_enum`]
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_class_udt_builtin_mixture]
|
||||
|
||||
[section template class udt_builtin_mixture<>]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -107,10 +121,12 @@ Classifying `S` and `T` as either user-defined or builtin, this __MPL_INTEGRAL_C
|
||||
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`]
|
||||
[link numeric_conversion_traits_udt_builtin_mixture_enum `boost::numeric::udt_builtin_mixture_enum`]
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_traits_is_subranged]
|
||||
|
||||
[section template class is_subranged<>]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -160,7 +176,7 @@ source values are representable as Target type.
|
||||
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.
|
||||
[link numeric_conversion_definitions_subranged 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
|
||||
@@ -170,26 +186,26 @@ Target types (thus they are call mixture):
|
||||
[[ ][ ]]
|
||||
[[[*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]
|
||||
[link numeric_conversion_traits_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]
|
||||
[link numeric_conversion_traits_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]
|
||||
[link numeric_conversion_traits_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).
|
||||
(see [link numeric_conversion_definitions_range Definitions] for details).
|
||||
|
||||
[table
|
||||
[[ ][ ]]
|
||||
[[subranged ][
|
||||
Same as given by [link boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__ is_subranged]
|
||||
Same as given by [link numeric_conversion_traits_is_subranged is_subranged]
|
||||
]]
|
||||
[[trivial][
|
||||
Indicates if both Source and Target, [_without cv-qualifications], are the same type.
|
||||
@@ -214,7 +230,7 @@ The template parameter `S` without cv-qualifications
|
||||
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.
|
||||
[link numeric_conversion_converter converter] member functions.
|
||||
|
||||
If S is a built-in type, this is `source_type`, otherwise, this is `source_type const&`.
|
||||
]]
|
||||
@@ -222,7 +238,7 @@ If S is a built-in type, this is `source_type`, otherwise, this is `source_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.
|
||||
[link numeric_conversion_converter converter] member functions.
|
||||
|
||||
If `T==S`, it is `target_type const&`, otherwise, it is `target_type`.
|
||||
]]
|
||||
|
||||
+16
-12
@@ -8,6 +8,8 @@
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[#numeric_conversion_converter]
|
||||
|
||||
[section converter<> function object]
|
||||
|
||||
[section Synopsis]
|
||||
@@ -50,7 +52,7 @@
|
||||
`boost::numeric::converter<>` is a __SGI_UNARY_FUNCTION__ encapsulating
|
||||
the code to perform a numeric conversion with the direction and
|
||||
properties specified by the Traits template parameter. It can optionally
|
||||
take some [link boost_numericconversion.numeric_converter_policy_classes policies] which can be used to customize its behavior. The
|
||||
take some [link numeric_coversion_converter_policies policies] which can be used to customize its behavior. The
|
||||
`Traits` parameter is not a policy but the parameter that defines
|
||||
the conversion.
|
||||
|
||||
@@ -61,16 +63,16 @@ the conversion.
|
||||
[table
|
||||
[[ ][ ]]
|
||||
[[`T`][
|
||||
The [link boost_numericconversion.definitions.numeric_types Numeric Type]
|
||||
The [link numeric_conversion_definitions_numeric_types Numeric Type]
|
||||
which is the ['Target] of the conversion.
|
||||
]]
|
||||
[[`S`][
|
||||
The [link boost_numericconversion.definitions.numeric_types Numeric Type]
|
||||
The [link numeric_conversion_definitions_numeric_types Numeric Type]
|
||||
which is the ['Source] of the conversion.
|
||||
]]
|
||||
[[`Traits`][
|
||||
This must be a conversion traits class with the interface of
|
||||
[link boost_numericconversion.conversion_traits___traits_class `boost::numeric::conversion_traits`]
|
||||
[link numeric_conversion_traits `boost::numeric::conversion_traits`]
|
||||
]]
|
||||
[[`OverflowHandler`][
|
||||
[*Stateless Policy] called to administrate the result of the range checking.
|
||||
@@ -141,19 +143,19 @@ represented by the target type without overflow.
|
||||
|
||||
It does not determine if the conversion is ['exact]; that is, it does not detect
|
||||
['inexact] conversions, only ['out-of-range] conversions (see the
|
||||
[link boost_numericconversion.definitions.exact__correctly_rounded_and_out_of_range_representations Definitions] for further details).
|
||||
[link numeric_conversion_definitions_roundoff Definitions] for further details).
|
||||
|
||||
The return value is of enum type
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result `boost::numeric::range_check_result`]
|
||||
[link numeric_conversion_converter_policies_range_check_result `boost::numeric::range_check_result`]
|
||||
|
||||
The actual code for the range checking logic is optimized for the combined
|
||||
properties of the source and target types. For example, a non-subranged
|
||||
conversion (i.e: `int`->`float`), requires no range checking, so `out_of_range()`
|
||||
returns `cInRange` directly. See the following
|
||||
[link boost_numericconversion.converter___function_object.range_checking_logic table] for more details.
|
||||
[link numeric_conversion_converter_range_checking_logic table] for more details.
|
||||
|
||||
If the user supplied a
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy,
|
||||
[link numeric_conversion_policy_user_range_checker UserRangeChecker] policy,
|
||||
is this policy which implements this function, so the implementation is user
|
||||
defined, although it is expected to perform the same conceptual check and
|
||||
return the appropriate result.
|
||||
@@ -165,14 +167,14 @@ __SPACE__
|
||||
|
||||
This [link numeric_conversion_converter_internal internal] static member function
|
||||
calls out_of_range(s), and passes the
|
||||
result to the [link boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler OverflowHandler]
|
||||
result to the [link numeric_conversion_policy_overflow_handler OverflowHandler]
|
||||
policy class.
|
||||
|
||||
For those Target/Source combinations which don't require range checking, this
|
||||
is an empty inline function.
|
||||
|
||||
If the user supplied a
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy,
|
||||
[link numeric_conversion_policy_user_range_checker UserRangeChecker] policy,
|
||||
is this policy which implements this function, so the implementation is user
|
||||
defined, although it is expected to perform the same action as the default.
|
||||
In particular, it is expected to pass the result of the check to the overflow handler.
|
||||
@@ -185,7 +187,7 @@ This [link numeric_conversion_converter_internal internal] static member functio
|
||||
performs the actual conversion.
|
||||
|
||||
This function is externally supplied by the
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy class.
|
||||
[link numeric_conversion_policy_raw_converter RawConverter] policy class.
|
||||
|
||||
__SPACE__
|
||||
|
||||
@@ -197,7 +199,7 @@ which is [_only used] for
|
||||
type]] according to some rounding direction.
|
||||
|
||||
This function is externally supplied by the
|
||||
[link boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder Float2IntRounder] policy class
|
||||
[link numeric_conversion_policy_float_to_int_rounder Float2IntRounder] policy class
|
||||
which encapsulates the specific rounding mode.
|
||||
|
||||
__SPACE__
|
||||
@@ -212,6 +214,8 @@ them infernally, but they can be called separately for specific needs.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_converter_range_checking_logic]
|
||||
|
||||
[section Range Checking Logic]
|
||||
|
||||
The following table summarizes the internal range checking logic performed for
|
||||
|
||||
@@ -8,9 +8,13 @@
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[#numeric_coversion_converter_policies]
|
||||
|
||||
[section Numeric Converter Policy Classes]
|
||||
|
||||
|
||||
[#numeric_conversion_converter_policies_range_check_result]
|
||||
|
||||
[section enum range_check_result]
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
@@ -28,6 +32,8 @@ Defines the values returned by `boost::numeric::converter<>::out_of_range()`
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_policy_overflow_handler]
|
||||
|
||||
[section Policy OverflowHandler]
|
||||
|
||||
This ['stateless] non-template policy class must be a ['function object] and is
|
||||
@@ -122,6 +128,8 @@ the old code is wider than for the new code).
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_policy_float_to_int_rounder]
|
||||
|
||||
[section Policy Float2IntRounder]
|
||||
|
||||
This ['stateless] template policy class specifies the rounding mode used
|
||||
@@ -219,11 +227,13 @@ 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]
|
||||
be visible. See also [link numeric_conversion_requirements User Defined Numeric Types]
|
||||
support.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_policy_raw_converter]
|
||||
|
||||
[section Policy RawConverter]
|
||||
|
||||
This ['stateless] template policy class is used to perform the
|
||||
@@ -265,6 +275,8 @@ This is the only raw converter policy class provided by the library:
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_policy_user_range_checker]
|
||||
|
||||
[section Policy UserRangeChecker]
|
||||
|
||||
This ['stateless] template policy class is used [_only if supplied]
|
||||
|
||||
+12
-2
@@ -85,6 +85,8 @@ rest of this document.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_cpp_arithmetic_types]
|
||||
|
||||
[section C++ Arithmetic Types]
|
||||
|
||||
The C++ language defines [_fundamental types] (§3.9.1). The following subsets of
|
||||
@@ -142,6 +144,8 @@ positive values only (you can do this with signed types as well).
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_definitions_numeric_types]
|
||||
|
||||
[section Numeric Types]
|
||||
|
||||
This section introduces the following definitions intended to integrate
|
||||
@@ -157,8 +161,8 @@ A type is [*numeric] if:
|
||||
* It is a user-defined type which
|
||||
* Represents numeric abstract values (i.e. numbers).
|
||||
* Can be converted (either implicitly or explicitly) to/from at least one arithmetic type.
|
||||
* Has [link boost_numericconversion.definitions.range_and_precision range] (possibly unbounded)
|
||||
and [link boost_numericconversion.definitions.range_and_precision precision] (possibly dynamic or
|
||||
* Has [link numeric_conversion_definitions_range range] (possibly unbounded)
|
||||
and [link numeric_conversion_definitions_range precision] (possibly dynamic or
|
||||
unlimited).
|
||||
* Provides an specialization of `std::numeric_limits`.
|
||||
|
||||
@@ -212,6 +216,8 @@ types (and values):
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_definitions_range]
|
||||
|
||||
[section Range and Precision]
|
||||
|
||||
Given a number set `N`, some of its elements are representable in a numeric type `T`.
|
||||
@@ -312,6 +318,8 @@ while the higher the number of mantissa bits, the higher the precision.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_definitions_roundoff]
|
||||
|
||||
[section Exact, Correctly Rounded and Out-Of-Range Representations]
|
||||
|
||||
Given an abstract value `V` and a type `T` with its corresponding range `[abt(l),abt(h)]`:
|
||||
@@ -446,6 +454,8 @@ that is, the conversion is required to be correctly rounded.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_definitions_subranged]
|
||||
|
||||
[section Subranged Conversion Direction, Subtype and Supertype]
|
||||
|
||||
Given a source type `S` and a destination type `T`, there is a
|
||||
|
||||
@@ -1,37 +1,47 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>bounds<> traits class</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>bounds<>
|
||||
traits class</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="type_requirements_and_user_defined_types_support.html" title="Type
|
||||
Requirements and User-defined-types support">
|
||||
<link rel="next" href="conversion_traits___traits_class.html" title="conversion_traits<>
|
||||
traits class">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="type_requirements_and_user_defined_types_support.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="conversion_traits___traits_class.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.bounds___traits_class"></a><a class="link" href="bounds___traits_class.html" title="bounds<> traits class">bounds<>
|
||||
<a name="boost_numericconversion.bounds___traits_class"></a><a href="bounds___traits_class.html" title="bounds<>
|
||||
traits class">bounds<>
|
||||
traits class</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.introduction">Introduction</a></span></dt>
|
||||
<dt><span class="section"><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.traits_class_bounds_n_">traits
|
||||
class bounds<N></a></span></dt>
|
||||
<dt><span class="section"><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.examples">Examples</a></span></dt>
|
||||
</dl></div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.bounds___traits_class.introduction"></a><a class="link" href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.introduction" title="Introduction">Introduction</a>
|
||||
<a name="boost_numericconversion.bounds___traits_class.introduction"></a><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.introduction" title="Introduction">Introduction</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
To determine the ranges of numeric types with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span></code>
|
||||
[18.2.1], different syntax have to be used depending on numeric type. Specifically,
|
||||
<code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">min</span><span class="special">()</span></code> for
|
||||
@@ -39,21 +49,22 @@
|
||||
types it returns the minimum positive normalized value. The difference in
|
||||
semantics makes client code unnecessarily complex and error prone.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">bounds</span><span class="special"><></span></code>
|
||||
provides a consistent interface for retrieving the maximum finite value,
|
||||
the minimum finite value and the minimum positive normalized value (0 for
|
||||
integral types) for numeric types. The selection of implementation is performed
|
||||
at compile time, so there is no runtime overhead.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.bounds___traits_class.traits_class_bounds_n_"></a><a class="link" href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.traits_class_bounds_n_" title="traits class bounds<N>">traits
|
||||
<a name="boost_numericconversion.bounds___traits_class.traits_class_bounds_n_"></a><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.traits_class_bounds_n_" title="traits
|
||||
class bounds<N>">traits
|
||||
class bounds<N></a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">N</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">N</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">bounds</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">static</span> <span class="identifier">N</span> <span class="identifier">lowest</span> <span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">implementation_defined</span><span class="special">;</span> <span class="special">}</span>
|
||||
@@ -61,48 +72,60 @@
|
||||
<span class="keyword">static</span> <span class="identifier">N</span> <span class="identifier">smallest</span><span class="special">()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">implementation_defined</span><span class="special">;</span> <span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="boost_numericconversion.bounds___traits_class.traits_class_bounds_n_.h0"></a>
|
||||
<span><a name="boost_numericconversion.bounds___traits_class.traits_class_bounds_n_.members"></a></span><a class="link" href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.traits_class_bounds_n_.members">Members</a>
|
||||
<a name="boost_numericconversion.bounds___traits_class.traits_class_bounds_n_.members"></a><h5>
|
||||
<a name="id2626382"></a>
|
||||
<a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.traits_class_bounds_n_.members">Members</a>
|
||||
</h5>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">lowest</span><span class="special">()</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">lowest</span><span class="special">()</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
Returns the minimum finite value, equivalent to <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">min</span><span class="special">()</span></code> when
|
||||
<code class="computeroutput"><span class="identifier">T</span></code> is an integral type, and
|
||||
to <code class="computeroutput"><span class="special">-</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span></code> when
|
||||
<code class="computeroutput"><span class="identifier">T</span></code> is a floating point type.
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">highest</span><span class="special">()</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">highest</span><span class="special">()</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
Returns the maximum finite value, equivalent to <code class="computeroutput"><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span></code>.
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">smallest</span><span class="special">()</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">smallest</span><span class="special">()</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
Returns the smallest positive normalized value for floating point types with
|
||||
denormalization, or returns 0 for integral types.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.bounds___traits_class.examples"></a><a class="link" href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.examples" title="Examples">Examples</a>
|
||||
<a name="boost_numericconversion.bounds___traits_class.examples"></a><a href="bounds___traits_class.html#boost_numericconversion.bounds___traits_class.examples" title="Examples">Examples</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
The following example demonstrates the use of <code class="computeroutput"><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">bounds</span><span class="special"><></span></code> and the equivalent code using <code class="computeroutput"><span class="identifier">numeric_limits</span></code>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||||
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">numeric</span><span class="special">/</span><span class="identifier">conversion</span><span class="special">/</span><span class="identifier">bounds</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">limits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
@@ -126,15 +149,19 @@
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="type_requirements_and_user_defined_types_support.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="conversion_traits___traits_class.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,43 +1,72 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>conversion_traits<> traits class</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>conversion_traits<>
|
||||
traits class</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="bounds___traits_class.html" title="bounds<>
|
||||
traits class">
|
||||
<link rel="next" href="numeric_converter_policy_classes.html" title="Numeric
|
||||
Converter Policy Classes">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="bounds___traits_class.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="numeric_converter_policy_classes.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class"></a><a class="link" href="conversion_traits___traits_class.html" title="conversion_traits<> traits class">conversion_traits<>
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class"></a><a href="conversion_traits___traits_class.html" title="conversion_traits<>
|
||||
traits class">conversion_traits<>
|
||||
traits class</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types">Types</a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.examples">Examples</a></span></dt>
|
||||
</dl></div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types" title="Types">Types</a>
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types" title="Types">Types</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum">enumeration
|
||||
int_float_mixture_enum</a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum">enumeration
|
||||
sign_mixture_enum</a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum">enumeration
|
||||
udt_builtin_mixture_enum</a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__">template
|
||||
class int_float_mixture<></a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__">template
|
||||
class sign_mixture<></a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__">template
|
||||
class udt_builtin_mixture<></a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__">template
|
||||
class is_subranged<></a></span></dt>
|
||||
<dt><span class="section"><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_conversion_traits__">template
|
||||
class conversion_traits<></a></span></dt>
|
||||
</dl></div>
|
||||
<a name="numeric_conversion_traits_int_float_mixture_enum"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum" title="enumeration int_float_mixture_enum">enumeration
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum" title="enumeration
|
||||
int_float_mixture_enum">enumeration
|
||||
int_float_mixture_enum</a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">enum</span> <span class="identifier">int_float_mixture_enum</span>
|
||||
<span class="special">{</span>
|
||||
@@ -47,16 +76,19 @@
|
||||
<span class="special">,</span><span class="identifier">float_to_float</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_sign_mixture_enum"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum" title="enumeration sign_mixture_enum">enumeration
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum" title="enumeration
|
||||
sign_mixture_enum">enumeration
|
||||
sign_mixture_enum</a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">enum</span> <span class="identifier">sign_mixture_enum</span>
|
||||
<span class="special">{</span>
|
||||
@@ -66,16 +98,19 @@
|
||||
<span class="special">,</span><span class="identifier">unsigned_to_signed</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_udt_builtin_mixture_enum"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum" title="enumeration udt_builtin_mixture_enum">enumeration
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum" title="enumeration
|
||||
udt_builtin_mixture_enum">enumeration
|
||||
udt_builtin_mixture_enum</a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">enum</span> <span class="identifier">udt_builtin_mixture_enum</span>
|
||||
<span class="special">{</span>
|
||||
@@ -85,114 +120,127 @@
|
||||
<span class="special">,</span><span class="identifier">udt_to_udt</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_class_int_float_mixture"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__" title="template class int_float_mixture<>">template
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__" title="template
|
||||
class int_float_mixture<>">template
|
||||
class int_float_mixture<></a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">int_float_mixture</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="identifier">int_float_mixture_enum</span><span class="special">,</span> <span class="identifier">impl</span><span class="special">-</span><span class="identifier">def</span><span class="special">-</span><span class="identifier">value</span><span class="special">></span> <span class="special">{}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
<p>
|
||||
Classifying <code class="computeroutput"><span class="identifier">S</span></code> and <code class="computeroutput"><span class="identifier">T</span></code> as either integral or float, this
|
||||
<a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> indicates the combination of these attributes.
|
||||
<a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's Integral
|
||||
Constant</a> indicates the combination of these attributes.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
Its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>
|
||||
is of enumeration type <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum" title="enumeration int_float_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">int_float_mixture_enum</span></code></a>
|
||||
is of enumeration type <a href="conversion_traits___traits_class.html#numeric_conversion_traits_int_float_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">int_float_mixture_enum</span></code></a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_class_sign_mixture"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__" title="template class sign_mixture<>">template
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__" title="template
|
||||
class sign_mixture<>">template
|
||||
class sign_mixture<></a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">sign_mixture</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="identifier">sign_mixture_enum</span><span class="special">,</span> <span class="identifier">impl</span><span class="special">-</span><span class="identifier">def</span><span class="special">-</span><span class="identifier">value</span><span class="special">></span> <span class="special">{}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
<p>
|
||||
Classifying <code class="computeroutput"><span class="identifier">S</span></code> and <code class="computeroutput"><span class="identifier">T</span></code> as either signed or unsigned, this
|
||||
<a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> indicates the combination of these attributes.
|
||||
<a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's Integral
|
||||
Constant</a> indicates the combination of these attributes.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
Its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>
|
||||
is of enumeration type <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum" title="enumeration sign_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">sign_mixture_enum</span></code></a>
|
||||
is of enumeration type <a href="conversion_traits___traits_class.html#numeric_conversion_traits_sign_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">sign_mixture_enum</span></code></a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_class_udt_builtin_mixture"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__" title="template class udt_builtin_mixture<>">template
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__" title="template
|
||||
class udt_builtin_mixture<>">template
|
||||
class udt_builtin_mixture<></a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">udt_builtin_mixture</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="identifier">udt_builtin__mixture_enum</span><span class="special">,</span> <span class="identifier">impl</span><span class="special">-</span><span class="identifier">def</span><span class="special">-</span><span class="identifier">value</span><span class="special">></span> <span class="special">{}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
<p>
|
||||
Classifying <code class="computeroutput"><span class="identifier">S</span></code> and <code class="computeroutput"><span class="identifier">T</span></code> as either user-defined or builtin,
|
||||
this <a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
this <a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> indicates the combination of these attributes.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
Its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>
|
||||
is of enumeration type <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum" title="enumeration udt_builtin_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">udt_builtin_mixture_enum</span></code></a>
|
||||
is of enumeration type <a href="conversion_traits___traits_class.html#numeric_conversion_traits_udt_builtin_mixture_enum"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">udt_builtin_mixture_enum</span></code></a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_traits_is_subranged"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__" title="template class is_subranged<>">template
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__" title="template
|
||||
class is_subranged<>">template
|
||||
class is_subranged<></a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">is_subranged</span> <span class="special">:</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">bool_</span><span class="special"><</span><span class="identifier">impl</span><span class="special">-</span><span class="identifier">def</span><span class="special">-</span><span class="identifier">value</span><span class="special">></span> <span class="special">{}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace boost::numeric
|
||||
</span></pre>
|
||||
<p>
|
||||
Indicates if the range of the target type <code class="computeroutput"><span class="identifier">T</span></code>
|
||||
is a subset of the range of the source type <code class="computeroutput"><span class="identifier">S</span></code>.
|
||||
That is: if there are some source values which fall out of the Target type's
|
||||
range.
|
||||
</p>
|
||||
<p>
|
||||
It is a boolean <a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
<p>
|
||||
It is a boolean <a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> .
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h4 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_conversion_traits__"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_conversion_traits__" title="template class conversion_traits<>">template
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.types.template_class_conversion_traits__"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_conversion_traits__" title="template
|
||||
class conversion_traits<>">template
|
||||
class conversion_traits<></a>
|
||||
</h4></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">conversion_traits</span>
|
||||
@@ -212,282 +260,292 @@
|
||||
<span class="keyword">typedef</span> <span class="special">...</span> <span class="identifier">subtype</span> <span class="special">;</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, namespace boost</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, namespace boost
|
||||
</span></pre>
|
||||
<p>
|
||||
This traits class indicates some properties of a <span class="emphasis"><em>numeric conversion</em></span>
|
||||
direction: from a source type <code class="computeroutput"><span class="identifier">S</span></code>
|
||||
to a target type <code class="computeroutput"><span class="identifier">T</span></code>. It
|
||||
does not indicate the properties of a <span class="emphasis"><em>specific</em></span> conversion,
|
||||
but of the conversion direction. See <a class="link" href="definitions.html#boost_numericconversion.definitions.subranged_conversion_direction__subtype_and_supertype" title="Subranged Conversion Direction, Subtype and Supertype">Definitions</a>
|
||||
but of the conversion direction. See <a href="definitions.html#numeric_conversion_definitions_subranged">Definitions</a>
|
||||
for details.
|
||||
</p>
|
||||
<p>
|
||||
The traits class provides the following <a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
<p>
|
||||
The traits class provides the following <a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> \s of enumeration type. They express the combination
|
||||
of certain attributes of the Source and Target types (thus they are call
|
||||
mixture):
|
||||
</p>
|
||||
<div class="informaltable">
|
||||
<table border="1">
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>int_float_mixture </strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>int_float_mixture </strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Same as given by the traits class <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__" title="template class int_float_mixture<>">int_float_mixture</a>
|
||||
</p>
|
||||
<p>
|
||||
Same as given by the traits class <a href="conversion_traits___traits_class.html#numeric_conversion_traits_class_int_float_mixture">int_float_mixture</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>sign_mixture </strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>sign_mixture </strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Same as given by the traits class <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__" title="template class sign_mixture<>">sign_mixture</a>
|
||||
</p>
|
||||
<p>
|
||||
Same as given by the traits class <a href="conversion_traits___traits_class.html#numeric_conversion_traits_class_sign_mixture">sign_mixture</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>udt_builtin_mixture </strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>udt_builtin_mixture </strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Same as given by the traits class <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__" title="template class udt_builtin_mixture<>">udt_builtin_mixture</a>
|
||||
</p>
|
||||
<p>
|
||||
Same as given by the traits class <a href="conversion_traits___traits_class.html#numeric_conversion_traits_class_udt_builtin_mixture">udt_builtin_mixture</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<p>
|
||||
The traits class provides the following <a class="ulink" href="../../../../mpl/doc/refmanual/integral-constant.html" target="_top">MPL's
|
||||
</table></div>
|
||||
<p>
|
||||
The traits class provides the following <a href="../../../../../mpl/refmanual/integral-constant.html" target="_top">MPL's
|
||||
Integral Constant</a> \s of boolean type which indicates indirectly
|
||||
the relation between the Source and Target ranges (see <a class="link" href="definitions.html#boost_numericconversion.definitions.range_and_precision" title="Range and Precision">Definitions</a>
|
||||
the relation between the Source and Target ranges (see <a href="definitions.html#numeric_conversion_definitions_range">Definitions</a>
|
||||
for details).
|
||||
</p>
|
||||
<div class="informaltable">
|
||||
<table border="1">
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
subranged
|
||||
</p>
|
||||
<p>
|
||||
subranged
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Same as given by <a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__" title="template class is_subranged<>">is_subranged</a>
|
||||
</p>
|
||||
<p>
|
||||
Same as given by <a href="conversion_traits___traits_class.html#numeric_conversion_traits_is_subranged">is_subranged</a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
trivial
|
||||
</p>
|
||||
<p>
|
||||
trivial
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
Indicates if both Source and Target, <span class="underline">without
|
||||
cv-qualifications</span>, are the same type.
|
||||
</p>
|
||||
<p>
|
||||
Its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>
|
||||
is of boolean type.
|
||||
</p>
|
||||
<p>
|
||||
Indicates if both Source and Target, <span class="underline">without
|
||||
cv-qualifications</span>, are the same type.
|
||||
</p>
|
||||
<p>
|
||||
Its <code class="computeroutput"><span class="special">::</span><span class="identifier">value</span></code>
|
||||
is of boolean type.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<p>
|
||||
</table></div>
|
||||
<p>
|
||||
The traits class provides the following types. They are the Source and
|
||||
Target types classified and qualified for different purposes.
|
||||
</p>
|
||||
<div class="informaltable">
|
||||
<table border="1">
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>target_type</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>target_type</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
The template parameter <code class="computeroutput"><span class="identifier">T</span></code>
|
||||
without cv-qualifications
|
||||
</p>
|
||||
<p>
|
||||
The template parameter <code class="computeroutput"><span class="identifier">T</span></code>
|
||||
without cv-qualifications
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>source_type</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>source_type</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
The template parameter <code class="computeroutput"><span class="identifier">S</span></code>
|
||||
without cv-qualifications
|
||||
</p>
|
||||
<p>
|
||||
The template parameter <code class="computeroutput"><span class="identifier">S</span></code>
|
||||
without cv-qualifications
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>argument_type</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>argument_type</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
This type is either source_type or <code class="computeroutput"><span class="identifier">source_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
It represents the optimal argument type for the <a class="link" href="converter___function_object.html" title="converter<> function object">converter</a>
|
||||
member functions.
|
||||
</p>
|
||||
<p>
|
||||
If S is a built-in type, this is <code class="computeroutput"><span class="identifier">source_type</span></code>,
|
||||
otherwise, this is <code class="computeroutput"><span class="identifier">source_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
This type is either source_type or <code class="computeroutput"><span class="identifier">source_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
It represents the optimal argument type for the <a href="../index.html#numeric_conversion_converter">converter</a>
|
||||
member functions.
|
||||
</p>
|
||||
<p>
|
||||
If S is a built-in type, this is <code class="computeroutput"><span class="identifier">source_type</span></code>,
|
||||
otherwise, this is <code class="computeroutput"><span class="identifier">source_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>result_type</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>result_type</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
This type is either target_type or target_type const&
|
||||
</p>
|
||||
<p>
|
||||
It represents the return type of the <a class="link" href="converter___function_object.html" title="converter<> function object">converter</a>
|
||||
member functions.
|
||||
</p>
|
||||
<p>
|
||||
If <code class="computeroutput"><span class="identifier">T</span><span class="special">==</span><span class="identifier">S</span></code>, it is <code class="computeroutput"><span class="identifier">target_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">target_type</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
This type is either target_type or target_type const&
|
||||
</p>
|
||||
<p>
|
||||
It represents the return type of the <a href="../index.html#numeric_conversion_converter">converter</a>
|
||||
member functions.
|
||||
</p>
|
||||
<p>
|
||||
If <code class="computeroutput"><span class="identifier">T</span><span class="special">==</span><span class="identifier">S</span></code>, it is <code class="computeroutput"><span class="identifier">target_type</span>
|
||||
<span class="keyword">const</span><span class="special">&</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">target_type</span></code>.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>supertype</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>supertype</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
If the conversion is subranged, it is <code class="computeroutput"><span class="identifier">source_type</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">target_type</span></code>
|
||||
</p>
|
||||
<p>
|
||||
If the conversion is subranged, it is <code class="computeroutput"><span class="identifier">source_type</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">target_type</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>subtype</strong></span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>subtype</strong></span>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
If the conversion is subranged, it is <code class="computeroutput"><span class="identifier">target_type</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">source_type</span></code>
|
||||
</p>
|
||||
<p>
|
||||
If the conversion is subranged, it is <code class="computeroutput"><span class="identifier">target_type</span></code>,
|
||||
otherwise, it is <code class="computeroutput"><span class="identifier">source_type</span></code>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
</table></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.examples"></a><a class="link" href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.examples" title="Examples">Examples</a>
|
||||
<a name="boost_numericconversion.conversion_traits___traits_class.examples"></a><a href="conversion_traits___traits_class.html#boost_numericconversion.conversion_traits___traits_class.examples" title="Examples">Examples</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">typeinfo</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">numeric</span><span class="special">/</span><span class="identifier">conversion</span><span class="special">/</span><span class="identifier">conversion_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
|
||||
<span class="comment">// A trivial conversion.</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">short</span><span class="special">></span> <span class="identifier">Short2Short_Traits</span> <span class="special">;</span>
|
||||
<span class="comment">// A trivial conversion.
|
||||
</span> <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span><span class="keyword">short</span><span class="special">></span> <span class="identifier">Short2Short_Traits</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">Short2Short_Traits</span><span class="special">::</span><span class="identifier">trivial</span><span class="special">::</span><span class="identifier">value</span> <span class="special">)</span> <span class="special">;</span>
|
||||
|
||||
<span class="comment">// A subranged conversion.</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">></span> <span class="identifier">UInt2Double_Traits</span> <span class="special">;</span>
|
||||
<span class="comment">// A subranged conversion.
|
||||
</span> <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">></span> <span class="identifier">UInt2Double_Traits</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">UInt2Double_Traits</span><span class="special">::</span><span class="identifier">int_float_mixture</span><span class="special">::</span><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">integral_to_float</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">UInt2Double_Traits</span><span class="special">::</span><span class="identifier">sign_mixture</span><span class="special">::</span><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">unsigned_to_signed</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">!</span><span class="identifier">UInt2Double_Traits</span><span class="special">::</span><span class="identifier">subranged</span><span class="special">::</span><span class="identifier">value</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">UInt2Double_Traits</span><span class="special">::</span><span class="identifier">supertype</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">typeid</span><span class="special">(</span><span class="keyword">double</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="keyword">typeid</span><span class="special">(</span><span class="identifier">UInt2Double_Traits</span><span class="special">::</span><span class="identifier">subtype</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">typeid</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||
|
||||
<span class="comment">// A doubly subranged conversion.</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">>::</span><span class="identifier">subranged</span><span class="special">::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">);</span>
|
||||
<span class="comment">// A doubly subranged conversion.
|
||||
</span> <span class="identifier">assert</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">short</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">>::</span><span class="identifier">subranged</span><span class="special">::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">);</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">short</span><span class="special">,</span> <span class="keyword">short</span><span class="special">>::</span><span class="identifier">subranged</span><span class="special">::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">);</span>
|
||||
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="bounds___traits_class.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="numeric_converter_policy_classes.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,37 +1,51 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>converter<> function object</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>converter<>
|
||||
function object</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="definitions.html" title="Definitions">
|
||||
<link rel="next" href="type_requirements_and_user_defined_types_support.html" title="Type
|
||||
Requirements and User-defined-types support">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="definitions.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="type_requirements_and_user_defined_types_support.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.converter___function_object"></a><a class="link" href="converter___function_object.html" title="converter<> function object">converter<>
|
||||
<a name="boost_numericconversion.converter___function_object"></a><a href="converter___function_object.html" title="converter<>
|
||||
function object">converter<>
|
||||
function object</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="converter___function_object.html#boost_numericconversion.converter___function_object.synopsis">Synopsis</a></span></dt>
|
||||
<dt><span class="section"><a href="converter___function_object.html#boost_numericconversion.converter___function_object.template_parameters">Template
|
||||
parameters</a></span></dt>
|
||||
<dt><span class="section"><a href="converter___function_object.html#boost_numericconversion.converter___function_object.member_functions">Member
|
||||
functions</a></span></dt>
|
||||
<dt><span class="section"><a href="converter___function_object.html#boost_numericconversion.converter___function_object.range_checking_logic">Range
|
||||
Checking Logic</a></span></dt>
|
||||
<dt><span class="section"><a href="converter___function_object.html#boost_numericconversion.converter___function_object.examples">Examples</a></span></dt>
|
||||
</dl></div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.converter___function_object.synopsis"></a><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.synopsis" title="Synopsis">Synopsis</a>
|
||||
<a name="boost_numericconversion.converter___function_object.synopsis"></a><a href="converter___function_object.html#boost_numericconversion.converter___function_object.synopsis" title="Synopsis">Synopsis</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span>
|
||||
@@ -54,8 +68,8 @@
|
||||
|
||||
<span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span>
|
||||
|
||||
<span class="comment">// Internal member functions:</span>
|
||||
|
||||
<span class="comment">// Internal member functions:
|
||||
</span>
|
||||
<span class="keyword">static</span> <span class="identifier">range_check_result</span> <span class="identifier">out_of_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">validate_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="keyword">static</span> <span class="identifier">result_type</span> <span class="identifier">low_level_convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">;</span>
|
||||
@@ -63,332 +77,361 @@
|
||||
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, boost</span>
|
||||
</pre>
|
||||
<p>
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, boost
|
||||
</span></pre>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">converter</span><span class="special"><></span></code>
|
||||
is a <a class="ulink" href="http://www.sgi.com/tech/stl/UnaryFunction.html" target="_top">Unary Function
|
||||
is a <a href="http://www.sgi.com/tech/stl/UnaryFunction.html" target="_top">Unary Function
|
||||
Object</a> encapsulating the code to perform a numeric conversion with
|
||||
the direction and properties specified by the Traits template parameter.
|
||||
It can optionally take some <a class="link" href="numeric_converter_policy_classes.html" title="Numeric Converter Policy Classes">policies</a>
|
||||
It can optionally take some <a href="../index.html#numeric_coversion_converter_policies">policies</a>
|
||||
which can be used to customize its behavior. The <code class="computeroutput"><span class="identifier">Traits</span></code>
|
||||
parameter is not a policy but the parameter that defines the conversion.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.converter___function_object.template_parameters"></a><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.template_parameters" title="Template parameters">Template
|
||||
<a name="boost_numericconversion.converter___function_object.template_parameters"></a><a href="converter___function_object.html#boost_numericconversion.converter___function_object.template_parameters" title="Template
|
||||
parameters">Template
|
||||
parameters</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<div class="informaltable">
|
||||
<table border="1">
|
||||
<div class="informaltable"><table class="table">
|
||||
<colgroup>
|
||||
<col>
|
||||
<col>
|
||||
</colgroup>
|
||||
<thead><tr>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
<th>
|
||||
<p>
|
||||
</p>
|
||||
</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">T</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">T</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
The <a class="link" href="definitions.html#boost_numericconversion.definitions.numeric_types" title="Numeric Types">Numeric
|
||||
Type</a> which is the <span class="emphasis"><em>Target</em></span> of the conversion.
|
||||
</p>
|
||||
<p>
|
||||
The <a href="definitions.html#numeric_conversion_definitions_numeric_types">Numeric
|
||||
Type</a> which is the <span class="emphasis"><em>Target</em></span> of the conversion.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">S</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">S</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
The <a class="link" href="definitions.html#boost_numericconversion.definitions.numeric_types" title="Numeric Types">Numeric
|
||||
Type</a> which is the <span class="emphasis"><em>Source</em></span> of the conversion.
|
||||
</p>
|
||||
<p>
|
||||
The <a href="definitions.html#numeric_conversion_definitions_numeric_types">Numeric
|
||||
Type</a> which is the <span class="emphasis"><em>Source</em></span> of the conversion.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">Traits</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">Traits</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
This must be a conversion traits class with the interface of <a class="link" href="conversion_traits___traits_class.html" title="conversion_traits<> traits class"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span></code></a>
|
||||
</p>
|
||||
<p>
|
||||
This must be a conversion traits class with the interface of <a href="../index.html#numeric_conversion_traits"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span></code></a>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">OverflowHandler</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">OverflowHandler</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> called to administrate
|
||||
the result of the range checking.
|
||||
</p>
|
||||
<p>
|
||||
It is a <span class="bold"><strong>Function Object</strong></span> which
|
||||
receives the result of <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code> and is called inside the <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code>
|
||||
static member function exposed by the converter.
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> called to administrate
|
||||
the result of the range checking.
|
||||
</p>
|
||||
<p>
|
||||
It is a <span class="bold"><strong>Function Object</strong></span> which receives
|
||||
the result of <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code> and is called inside the <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code>
|
||||
static member function exposed by the converter.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">Float2IntRounder</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">Float2IntRounder</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> which specifies
|
||||
the rounding mode used for float to integral conversions.
|
||||
</p>
|
||||
<p>
|
||||
It supplies the <code class="computeroutput"><span class="identifier">nearbyint</span><span class="special">()</span></code> static member function exposed
|
||||
by the converter.
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> which specifies
|
||||
the rounding mode used for float to integral conversions.
|
||||
</p>
|
||||
<p>
|
||||
It supplies the <code class="computeroutput"><span class="identifier">nearbyint</span><span class="special">()</span></code> static member function exposed
|
||||
by the converter.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">RawConverter</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">RawConverter</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> which is used
|
||||
to perform the actual conversion.
|
||||
</p>
|
||||
<p>
|
||||
It supplies the <code class="computeroutput"><span class="identifier">low_level_convert</span><span class="special">()</span></code> static member function exposed
|
||||
by the converter.
|
||||
</p>
|
||||
<p>
|
||||
<span class="bold"><strong>Stateless Policy</strong></span> which is used to
|
||||
perform the actual conversion.
|
||||
</p>
|
||||
<p>
|
||||
It supplies the <code class="computeroutput"><span class="identifier">low_level_convert</span><span class="special">()</span></code> static member function exposed
|
||||
by the converter.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">UserRangeChecker</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">UserRangeChecker</span></code>
|
||||
</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>
|
||||
<span class="emphasis"><em>Special and Optional</em></span> <span class="bold"><strong>Stateless
|
||||
Policy</strong></span> which can be used to override the internal range
|
||||
checking logic.
|
||||
</p>
|
||||
<p>
|
||||
If given, supplies alternative code for the <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code> static member functions exposed
|
||||
by the converter.
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>Special and Optional</em></span> <span class="bold"><strong>Stateless
|
||||
Policy</strong></span> which can be used to override the internal range
|
||||
checking logic.
|
||||
</p>
|
||||
<p>
|
||||
If given, supplies alternative code for the <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code> static member functions exposed
|
||||
by the converter.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
</table></div>
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.converter___function_object.member_functions"></a><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.member_functions" title="Member functions">Member
|
||||
<a name="boost_numericconversion.converter___function_object.member_functions"></a><a href="converter___function_object.html#boost_numericconversion.converter___function_object.member_functions" title="Member
|
||||
functions">Member
|
||||
functions</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">result_type</span>
|
||||
<span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span> <span class="comment">// throw</span> </code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">result_type</span>
|
||||
<span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">convert</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span>
|
||||
<span class="comment">// throw </span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This static member function converts an rvalue of type <code class="computeroutput"><span class="identifier">source_type</span></code>
|
||||
to an rvalue of type <code class="computeroutput"><span class="identifier">target_type</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
If the conversion requires it, it performs a range checking before the conversion
|
||||
and passes the result of the check to the overflow handler policy (the default
|
||||
policy throws an exception if out-of-range is detected)
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The implementation of this function is actually built from the policies and
|
||||
is basically as follows:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="identifier">result_type</span> <span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<pre class="programlisting">
|
||||
<span class="identifier">result_type</span> <span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">validate_range</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Implemented by the internal range checking logic</span>
|
||||
<span class="comment">// (which also calls the OverflowHandler policy)</span>
|
||||
<span class="comment">// or externally supplied by the UserRangeChecker policy.</span>
|
||||
|
||||
<span class="identifier">s</span> <span class="special">=</span> <span class="identifier">nearbyint</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Externally supplied by the Float2IntRounder policy.</span>
|
||||
<span class="comment">// NOTE: This is actually called only for float to int conversions.</span>
|
||||
|
||||
<span class="keyword">return</span> <span class="identifier">low_level_convert</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Externally supplied by the RawConverter policy.</span>
|
||||
<span class="special">}</span>
|
||||
<span class="identifier">validate_range</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Implemented by the internal range checking logic
|
||||
</span> <span class="comment">// (which also calls the OverflowHandler policy)
|
||||
</span> <span class="comment">// or externally supplied by the UserRangeChecker policy.
|
||||
</span>
|
||||
<span class="identifier">s</span> <span class="special">=</span> <span class="identifier">nearbyint</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Externally supplied by the Float2IntRounder policy.
|
||||
</span> <span class="comment">// NOTE: This is actually called only for float to int conversions.
|
||||
</span>
|
||||
<span class="keyword">return</span> <span class="identifier">low_level_convert</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span> <span class="comment">// Externally supplied by the RawConverter policy.
|
||||
</span><span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">converter</span><span class="special"><>::</span><span class="keyword">operator</span><span class="special">()</span> <span class="keyword">const</span></code> just calls <code class="computeroutput"><span class="identifier">convert</span><span class="special">()</span></code>
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">range_check_result</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">out_of_range</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">range_check_result</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">out_of_range</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a class="link" href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
static member function determines if the value <code class="computeroutput"><span class="identifier">s</span></code>
|
||||
can be represented by the target type without overflow.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
It does not determine if the conversion is <span class="emphasis"><em>exact</em></span>; that
|
||||
is, it does not detect <span class="emphasis"><em>inexact</em></span> conversions, only <span class="emphasis"><em>out-of-range</em></span>
|
||||
conversions (see the <a class="link" href="definitions.html#boost_numericconversion.definitions.exact__correctly_rounded_and_out_of_range_representations" title="Exact, Correctly Rounded and Out-Of-Range Representations">Definitions</a>
|
||||
conversions (see the <a href="definitions.html#numeric_conversion_definitions_roundoff">Definitions</a>
|
||||
for further details).
|
||||
</p>
|
||||
<p>
|
||||
The return value is of enum type <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result" title="enum range_check_result"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">range_check_result</span></code></a>
|
||||
<p>
|
||||
The return value is of enum type <a href="numeric_converter_policy_classes.html#numeric_conversion_converter_policies_range_check_result"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">range_check_result</span></code></a>
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The actual code for the range checking logic is optimized for the combined
|
||||
properties of the source and target types. For example, a non-subranged conversion
|
||||
(i.e: <code class="computeroutput"><span class="keyword">int</span></code>-><code class="computeroutput"><span class="keyword">float</span></code>), requires no range checking, so <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code>
|
||||
returns <code class="computeroutput"><span class="identifier">cInRange</span></code> directly.
|
||||
See the following <a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.range_checking_logic" title="Range Checking Logic">table</a>
|
||||
See the following <a href="converter___function_object.html#numeric_conversion_converter_range_checking_logic">table</a>
|
||||
for more details.
|
||||
</p>
|
||||
<p>
|
||||
If the user supplied a <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker" title="Policy UserRangeChecker">UserRangeChecker</a>
|
||||
<p>
|
||||
If the user supplied a <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_user_range_checker">UserRangeChecker</a>
|
||||
policy, is this policy which implements this function, so the implementation
|
||||
is user defined, although it is expected to perform the same conceptual check
|
||||
and return the appropriate result.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="keyword">void</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">validate_range</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span> <span class="comment">// no throw</span> </code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="keyword">void</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">validate_range</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span>
|
||||
<span class="comment">// no throw </span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a class="link" href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
static member function calls out_of_range(s), and passes the result to the
|
||||
<a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler" title="Policy OverflowHandler">OverflowHandler</a>
|
||||
<a href="numeric_converter_policy_classes.html#numeric_conversion_policy_overflow_handler">OverflowHandler</a>
|
||||
policy class.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
For those Target/Source combinations which don't require range checking,
|
||||
this is an empty inline function.
|
||||
</p>
|
||||
<p>
|
||||
If the user supplied a <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker" title="Policy UserRangeChecker">UserRangeChecker</a>
|
||||
<p>
|
||||
If the user supplied a <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_user_range_checker">UserRangeChecker</a>
|
||||
policy, is this policy which implements this function, so the implementation
|
||||
is user defined, although it is expected to perform the same action as the
|
||||
default. In particular, it is expected to pass the result of the check to
|
||||
the overflow handler.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">result_type</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">low_level_convert</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">result_type</span>
|
||||
<span class="identifier">numeric_converter</span><span class="special"><>::</span><span class="identifier">low_level_convert</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a class="link" href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
static member function performs the actual conversion.
|
||||
</p>
|
||||
<p>
|
||||
This function is externally supplied by the <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter" title="Policy RawConverter">RawConverter</a>
|
||||
<p>
|
||||
This function is externally supplied by the <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_raw_converter">RawConverter</a>
|
||||
policy class.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||
</p>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">source_type</span>
|
||||
<span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">nearbyint</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
<div class="blockquote"><blockquote class="blockquote">
|
||||
<p>
|
||||
</p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="keyword">static</span> <span class="identifier">source_type</span>
|
||||
<span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">nearbyint</span> <span class="special">(</span>
|
||||
<span class="identifier">argument_type</span> <span class="identifier">s</span>
|
||||
<span class="special">)</span> <span class="special">;</span></code>
|
||||
</p>
|
||||
<p>
|
||||
</p>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a class="link" href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
</blockquote></div>
|
||||
<p>
|
||||
This <a href="converter___function_object.html#numeric_conversion_converter_internal">internal</a>
|
||||
static member function, which is <span class="underline">only used</span>
|
||||
for <code class="computeroutput"><span class="keyword">float</span></code> to <code class="computeroutput"><span class="keyword">int</span></code>
|
||||
conversions, returns an <span class="emphasis"><em>integer</em></span> value of <span class="emphasis"><em><span class="underline">floating-point type</span></em></span> according to some
|
||||
rounding direction.
|
||||
</p>
|
||||
<p>
|
||||
This function is externally supplied by the <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder" title="Policy Float2IntRounder">Float2IntRounder</a>
|
||||
<p>
|
||||
This function is externally supplied by the <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_float_to_int_rounder">Float2IntRounder</a>
|
||||
policy class which encapsulates the specific rounding mode.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<span class="inlinemediaobject"><img src="../images/space.png" alt="space"></span>
|
||||
</p>
|
||||
<a name="numeric_conversion_converter_internal"></a>
|
||||
<h5>
|
||||
<a name="boost_numericconversion.converter___function_object.member_functions.h0"></a>
|
||||
<span><a name="boost_numericconversion.converter___function_object.member_functions.internal_member_functions"></a></span><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.member_functions.internal_member_functions">Internal
|
||||
<a name="numeric_conversion_converter_internal"></a><p>
|
||||
</p>
|
||||
<a name="boost_numericconversion.converter___function_object.member_functions.internal_member_functions"></a><h5>
|
||||
<a name="id2624118"></a>
|
||||
<a href="converter___function_object.html#boost_numericconversion.converter___function_object.member_functions.internal_member_functions">Internal
|
||||
Member Functions</a>
|
||||
</h5>
|
||||
<p>
|
||||
<p>
|
||||
These static member functions build the actual conversion code used by <code class="computeroutput"><span class="identifier">convert</span><span class="special">()</span></code>.
|
||||
The user does not have to call these if calling <code class="computeroutput"><span class="identifier">convert</span><span class="special">()</span></code>, since <code class="computeroutput"><span class="identifier">convert</span><span class="special">()</span></code> calls them infernally, but they can be
|
||||
called separately for specific needs.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_converter_range_checking_logic"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.converter___function_object.range_checking_logic"></a><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.range_checking_logic" title="Range Checking Logic">Range
|
||||
<a name="boost_numericconversion.converter___function_object.range_checking_logic"></a><a href="converter___function_object.html#boost_numericconversion.converter___function_object.range_checking_logic" title="Range
|
||||
Checking Logic">Range
|
||||
Checking Logic</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
The following table summarizes the internal range checking logic performed
|
||||
for each combination of the properties of Source and Target.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
LowestT/HighestT denotes the highest and lowest values of the Target type,
|
||||
respectively.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">S</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code> is short
|
||||
for <code class="computeroutput"><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">S</span><span class="special">>(</span><span class="identifier">n</span><span class="special">)</span></code> (<code class="computeroutput"><span class="identifier">S</span></code> denotes the Source type).
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">NONE</span></code> indicates that for this
|
||||
case there is no range checking.
|
||||
</p>
|
||||
@@ -419,13 +462,13 @@ float_to_float |--> subranged |--> ( s >= S(LowestT) ) && (
|
||||
|--> not subranged |--> NONE
|
||||
</code>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.converter___function_object.examples"></a><a class="link" href="converter___function_object.html#boost_numericconversion.converter___function_object.examples" title="Examples">Examples</a>
|
||||
<a name="boost_numericconversion.converter___function_object.examples"></a><a href="converter___function_object.html#boost_numericconversion.converter___function_object.examples" title="Examples">Examples</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span>
|
||||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">numeric</span><span class="special">/</span><span class="identifier">conversion</span><span class="special">/</span><span class="identifier">converter</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
|
||||
@@ -435,14 +478,14 @@ float_to_float |--> subranged |--> ( s >= S(LowestT) ) && (
|
||||
<span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">Double2Int</span><span class="special">::</span><span class="identifier">convert</span><span class="special">(</span><span class="number">2.0</span><span class="special">);</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">x</span> <span class="special">==</span> <span class="number">2</span> <span class="special">);</span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">Double2Int</span><span class="special">()(</span><span class="number">3.14</span><span class="special">);</span> <span class="comment">// As a function object.</span>
|
||||
<span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">y</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// The default rounding is trunc.</span>
|
||||
|
||||
<span class="keyword">int</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">Double2Int</span><span class="special">()(</span><span class="number">3.14</span><span class="special">);</span> <span class="comment">// As a function object.
|
||||
</span> <span class="identifier">assert</span> <span class="special">(</span> <span class="identifier">y</span> <span class="special">==</span> <span class="number">3</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// The default rounding is trunc.
|
||||
</span>
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">double</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">bounds</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">highest</span><span class="special">();</span>
|
||||
<span class="keyword">int</span> <span class="identifier">z</span> <span class="special">=</span> <span class="identifier">Double2Int</span><span class="special">::</span><span class="identifier">convert</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> <span class="comment">// By default throws positive_overflow()</span>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">int</span> <span class="identifier">z</span> <span class="special">=</span> <span class="identifier">Double2Int</span><span class="special">::</span><span class="identifier">convert</span><span class="special">(</span><span class="identifier">m</span><span class="special">);</span> <span class="comment">// By default throws positive_overflow()
|
||||
</span> <span class="special">}</span>
|
||||
<span class="keyword">catch</span> <span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">positive_overflow</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="special">}</span>
|
||||
@@ -450,15 +493,19 @@ float_to_float |--> subranged |--> ( s >= S(LowestT) ) && (
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="definitions.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="type_requirements_and_user_defined_types_support.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,65 +1,68 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Improved numeric_cast<></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Improved
|
||||
numeric_cast<></title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="numeric_converter_policy_classes.html" title="Numeric
|
||||
Converter Policy Classes">
|
||||
<link rel="next" href="../numeric_conversion/history_and_acknowledgments.html" title="History
|
||||
and Acknowledgments">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="numeric_converter_policy_classes.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../numeric_conversion/history_and_acknowledgments.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.improved_numeric_cast__"></a><a class="link" href="improved_numeric_cast__.html" title="Improved numeric_cast<>">Improved
|
||||
<a name="boost_numericconversion.improved_numeric_cast__"></a><a href="improved_numeric_cast__.html" title="Improved
|
||||
numeric_cast<>">Improved
|
||||
numeric_cast<></a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.introduction">Introduction</a></span></dt>
|
||||
<dt><span class="section"><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast">numeric_cast</a></span></dt>
|
||||
<dt><span class="section"><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.examples">Examples</a></span></dt>
|
||||
</dl></div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.introduction"></a><a class="link" href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.introduction" title="Introduction">Introduction</a>
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.introduction"></a><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.introduction" title="Introduction">Introduction</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
The lack of preservation of range makes conversions between numeric types
|
||||
error prone. This is true for both implicit conversions and explicit conversions
|
||||
(through <code class="computeroutput"><span class="keyword">static_cast</span></code>). <a class="link" href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast" title="numeric_cast"><code class="computeroutput"><span class="identifier">numeric_cast</span></code></a> detects loss of range
|
||||
when a numeric type is converted, and throws an exception if the range cannot
|
||||
be preserved.
|
||||
(through <code class="computeroutput"><span class="keyword">static_cast</span></code>). <a href="improved_numeric_cast__.html#numeric_conversion_numeric_cast"><code class="computeroutput"><span class="identifier">numeric_cast</span></code></a>
|
||||
detects loss of range when a numeric type is converted, and throws an exception
|
||||
if the range cannot be preserved.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
There are several situations where conversions are unsafe:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
Conversions from an integral type with a wider range than the target
|
||||
integral type.
|
||||
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
Conversions from an integral type with a wider range than the target integral
|
||||
type.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Conversions from unsigned to signed (and vice versa) integral types.
|
||||
|
||||
<li>
|
||||
Conversions from unsigned to signed (and vice versa) integral types.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Conversions from floating point types to integral types.
|
||||
|
||||
<li>
|
||||
Conversions from floating point types to integral types.
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
<p>
|
||||
The C++ Standard does not specify the behavior when a numeric type is assigned
|
||||
a value that cannot be represented by the type, except for unsigned integral
|
||||
types [3.9.1.4], which must obey the laws of arithmetic modulo 2n (this implies
|
||||
@@ -69,87 +72,54 @@
|
||||
to unsigned) makes any code that may produce positive or negative overflows
|
||||
exposed to portability issues.
|
||||
</p>
|
||||
<p>
|
||||
By default <code class="computeroutput"><span class="identifier">numeric_cast</span></code> adheres
|
||||
to the rules for implicit conversions mandated by the C++ Standard, such
|
||||
as truncating floating point types when converting to integral types. The
|
||||
implementation must guarantee that for a conversion to a type that can hold
|
||||
all possible values of the source type, there will be no runtime overhead.
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">numeric_cast</span></code> adheres to the
|
||||
rules for implicit conversions mandated by the C++ Standard, such as truncating
|
||||
floating point types when converting to integral types. The implementation
|
||||
must guarantee that for a conversion to a type that can hold all possible
|
||||
values of the source type, there will be no runtime overhead.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_numeric_cast"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.numeric_cast"></a><a class="link" href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast" title="numeric_cast">numeric_cast</a>
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.numeric_cast"></a><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast" title="numeric_cast">numeric_cast</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Target</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Source</span><span class="special">></span> <span class="keyword">inline</span>
|
||||
<span class="identifier">Target</span> <span class="identifier">numeric_cast</span><span class="special">(</span> <span class="identifier">Source</span> <span class="identifier">arg</span> <span class="special">)</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Target</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Source</span><span class="special">></span> <span class="keyword">inline</span>
|
||||
<span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">converter</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span><span class="identifier">Source</span><span class="special">>::</span><span class="identifier">result_type</span>
|
||||
<span class="identifier">numeric_cast</span> <span class="special">(</span> <span class="identifier">Source</span> <span class="identifier">arg</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">conversion_traits</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> <span class="identifier">Source</span><span class="special">></span> <span class="identifier">conv_traits</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">numeric_cast_traits</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> <span class="identifier">Source</span><span class="special">></span> <span class="identifier">cast_traits</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">converter</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">Target</span><span class="special">,</span>
|
||||
<span class="identifier">Source</span><span class="special">,</span>
|
||||
<span class="identifier">conv_traits</span><span class="special">,</span>
|
||||
<span class="keyword">typename</span> <span class="identifier">cast_traits</span><span class="special">::</span><span class="identifier">overflow_policy</span><span class="special">,</span>
|
||||
<span class="keyword">typename</span> <span class="identifier">cast_traits</span><span class="special">::</span><span class="identifier">rounding_policy</span><span class="special">,</span>
|
||||
<span class="identifier">raw_converter</span><span class="special"><</span><span class="identifier">conv_traits</span><span class="special">>,</span>
|
||||
<span class="keyword">typename</span> <span class="identifier">cast_traits</span><span class="special">::</span><span class="identifier">range_checking_policy</span>
|
||||
<span class="special">></span> <span class="identifier">converter</span><span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="identifier">converter</span><span class="special">::</span><span class="identifier">convert</span><span class="special">(</span><span class="identifier">arg</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">converter</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span><span class="identifier">Source</span><span class="special">>::</span><span class="identifier">convert</span><span class="special">(</span><span class="identifier">arg</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
<code class="computeroutput"><span class="identifier">numeric_cast</span></code> returns the
|
||||
result of converting a value of type Source to a value of type Target. If
|
||||
out-of-range is detected, an overflow policy is executed whose default behavior
|
||||
is to throw an an exception (see <a class="link" href="numeric_converter_policy_classes.html#numeric_conversion_bad_numeric_cast">bad_numeric_cast</a>,
|
||||
<a class="link" href="numeric_converter_policy_classes.html#numeric_conversion_negative_overflow">negative_overflow</a>
|
||||
and <a class="link" href="numeric_converter_policy_classes.html#numeric_conversion_possitive_overflow">positive_overflow</a>
|
||||
out-of-range is detected, an exception is thrown (see <a href="numeric_converter_policy_classes.html#numeric_conversion_bad_numeric_cast">bad_numeric_cast</a>,
|
||||
<a href="numeric_converter_policy_classes.html#numeric_conversion_negative_overflow">negative_overflow</a>
|
||||
and <a href="numeric_converter_policy_classes.html#numeric_conversion_possitive_overflow">positive_overflow</a>
|
||||
).
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.numeric_cast_traits"></a><a class="link" href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast_traits" title="numeric_cast_traits">numeric_cast_traits</a>
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.examples"></a><a href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.examples" title="Examples">Examples</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Target</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Source</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">EnableIf</span> <span class="special">=</span> <span class="keyword">void</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">numeric_cast_traits</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">def_overflow_handler</span> <span class="identifier">overflow_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">UseInternalRangeChecker</span> <span class="identifier">range_checking_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">Trunc</span><span class="special"><</span><span class="identifier">Source</span><span class="special">></span> <span class="identifier">rounding_policy</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
</pre>
|
||||
<p>
|
||||
The behavior of <code class="computeroutput"><span class="identifier">numeric_cast</span></code>
|
||||
may be tailored for custom numeric types through the specialization of <code class="computeroutput"><span class="identifier">numeric_cast_traits</span></code>. (see <a class="link" href="type_requirements_and_user_defined_types_support.html" title="Type Requirements and User-defined-types support">User
|
||||
Defined Types</a> for details. )
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.improved_numeric_cast__.examples"></a><a class="link" href="improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.examples" title="Examples">Examples</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
The following example performs some typical conversions between numeric types:
|
||||
</p>
|
||||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||||
<li class="listitem">
|
||||
|
||||
include <boost/numeric/conversion/cast.hpp>
|
||||
|
||||
<div class="orderedlist"><ol type="1">
|
||||
<li>
|
||||
include <boost/numeric/conversion/cast.hpp>
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
include <iostream>
|
||||
|
||||
<li>
|
||||
include <iostream>
|
||||
</li>
|
||||
</ol></div>
|
||||
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric_cast</span><span class="special">;</span>
|
||||
|
||||
@@ -160,8 +130,8 @@
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">42</span><span class="special">;</span>
|
||||
<span class="keyword">short</span> <span class="identifier">s</span><span class="special">=</span><span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">short</span><span class="special">>(</span><span class="identifier">i</span><span class="special">);</span> <span class="comment">// This conversion succeeds (is in range)</span>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">short</span> <span class="identifier">s</span><span class="special">=</span><span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">short</span><span class="special">>(</span><span class="identifier">i</span><span class="special">);</span> <span class="comment">// This conversion succeeds (is in range)
|
||||
</span> <span class="special">}</span>
|
||||
<span class="keyword">catch</span><span class="special">(</span><span class="identifier">negative_overflow</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">();</span>
|
||||
<span class="special">}</span>
|
||||
@@ -173,23 +143,23 @@
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">float</span> <span class="identifier">f</span><span class="special">=-</span><span class="number">42.1234</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">// This will cause a boost::numeric::negative_overflow exception to be thrown</span>
|
||||
<span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">>(</span><span class="identifier">f</span><span class="special">);</span>
|
||||
<span class="comment">// This will cause a boost::numeric::negative_overflow exception to be thrown
|
||||
</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">int</span><span class="special">>(</span><span class="identifier">f</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">catch</span><span class="special">(</span><span class="identifier">bad_numeric_cast</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">();</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">d</span><span class="special">=</span> <span class="identifier">f</span> <span class="special">+</span> <span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">123</span><span class="special">);</span> <span class="comment">// int -> double</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">d</span><span class="special">=</span> <span class="identifier">f</span> <span class="special">+</span> <span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="number">123</span><span class="special">);</span> <span class="comment">// int -> double
|
||||
</span>
|
||||
<span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="identifier">l</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">long</span><span class="special">>::</span><span class="identifier">max</span><span class="special">();</span>
|
||||
|
||||
<span class="keyword">try</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">// This will cause a boost::numeric::positive_overflow exception to be thrown</span>
|
||||
<span class="comment">// NOTE: *operations* on unsigned integral types cannot cause overflow</span>
|
||||
<span class="comment">// but *conversions* to a signed type ARE range checked by numeric_cast.</span>
|
||||
|
||||
<span class="comment">// This will cause a boost::numeric::positive_overflow exception to be thrown
|
||||
</span> <span class="comment">// NOTE: *operations* on unsigned integral types cannot cause overflow
|
||||
</span> <span class="comment">// but *conversions* to a signed type ARE range checked by numeric_cast.
|
||||
</span>
|
||||
<span class="keyword">unsigned</span> <span class="keyword">char</span> <span class="identifier">c</span><span class="special">=</span><span class="identifier">numeric_cast</span><span class="special"><</span><span class="keyword">unsigned</span> <span class="keyword">char</span><span class="special">>(</span><span class="identifier">l</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="keyword">catch</span><span class="special">(</span><span class="identifier">positive_overflow</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
|
||||
@@ -200,15 +170,19 @@
|
||||
<span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="numeric_converter_policy_classes.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="../numeric_conversion/history_and_acknowledgments.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,38 +1,58 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Numeric Converter Policy Classes</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Numeric
|
||||
Converter Policy Classes</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="conversion_traits___traits_class.html" title="conversion_traits<>
|
||||
traits class">
|
||||
<link rel="next" href="improved_numeric_cast__.html" title="Improved
|
||||
numeric_cast<>">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="conversion_traits___traits_class.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="improved_numeric_cast__.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes"></a><a class="link" href="numeric_converter_policy_classes.html" title="Numeric Converter Policy Classes">Numeric
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes"></a><a href="numeric_converter_policy_classes.html" title="Numeric
|
||||
Converter Policy Classes">Numeric
|
||||
Converter Policy Classes</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result">enum
|
||||
range_check_result</a></span></dt>
|
||||
<dt><span class="section"><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler">Policy
|
||||
OverflowHandler</a></span></dt>
|
||||
<dt><span class="section"><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder">Policy
|
||||
Float2IntRounder</a></span></dt>
|
||||
<dt><span class="section"><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter">Policy
|
||||
RawConverter</a></span></dt>
|
||||
<dt><span class="section"><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker">Policy
|
||||
UserRangeChecker</a></span></dt>
|
||||
</dl></div>
|
||||
<a name="numeric_conversion_converter_policies_range_check_result"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result"></a><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result" title="enum range_check_result">enum
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result"></a><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result" title="enum
|
||||
range_check_result">enum
|
||||
range_check_result</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">enum</span> <span class="identifier">range_check_result</span>
|
||||
<span class="special">{</span>
|
||||
@@ -43,43 +63,47 @@
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
Defines the values returned by <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">converter</span><span class="special"><>::</span><span class="identifier">out_of_range</span><span class="special">()</span></code>
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_policy_overflow_handler"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler"></a><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler" title="Policy OverflowHandler">Policy
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler"></a><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler" title="Policy
|
||||
OverflowHandler">Policy
|
||||
OverflowHandler</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
This <span class="emphasis"><em>stateless</em></span> non-template policy class must be a
|
||||
<span class="emphasis"><em>function object</em></span> 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 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span></code> or derived.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
It must have the following interface (it does not has to be a template class):
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">YourOverflowHandlerPolicy</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">struct</span> <span class="identifier">YourOverflowHandlerPolicy</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_check_result</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// throw bad_cast or derived</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">range_check_result</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// throw bad_cast or derived
|
||||
</span><span class="special">}</span> <span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
It is called with the result of the converter's <code class="computeroutput"><span class="identifier">out_of_range</span><span class="special">()</span></code> inside <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
These are the two overflow handler classes provided by the library:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">struct</span> <span class="identifier">def_overflow_handler</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">range_check_result</span> <span class="identifier">r</span> <span class="special">)</span> <span class="comment">// throw bad_numeric_conversion derived</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">range_check_result</span> <span class="identifier">r</span> <span class="special">)</span> <span class="comment">// throw bad_numeric_conversion derived
|
||||
</span> <span class="special">{</span>
|
||||
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">r</span> <span class="special">==</span> <span class="identifier">cNegOverflow</span> <span class="special">)</span>
|
||||
<span class="keyword">throw</span> <span class="identifier">negative_overflow</span><span class="special">()</span> <span class="special">;</span>
|
||||
<span class="keyword">else</span> <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">r</span> <span class="special">==</span> <span class="identifier">cPosOverflow</span> <span class="special">)</span>
|
||||
@@ -89,46 +113,47 @@
|
||||
|
||||
<span class="keyword">struct</span> <span class="identifier">silent_overflow_handler</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">range_check_result</span> <span class="special">)</span> <span class="comment">// no-throw</span>
|
||||
<span class="special">{}</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">range_check_result</span> <span class="special">)</span> <span class="comment">// no-throw
|
||||
</span> <span class="special">{}</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
And these are the Exception Classes thrown by the default overflow handler
|
||||
<a class="link" href="numeric_converter_policy_classes.html#numeric_conversion_policy_overflow_handler_important_note">(see
|
||||
<a href="numeric_converter_policy_classes.html#numeric_conversion_policy_overflow_handler_important_note">(see
|
||||
IMPORTANT note)</a>
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<a name="numeric_conversion_bad_numeric_cast"></a><a name="numeric_conversion_negative_overflow"></a><a name="numeric_conversion_possitive_overflow"></a><pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<a name="numeric_conversion_bad_numeric_cast"></a>
|
||||
|
||||
<span class="keyword">class</span> <span class="identifier">bad_numeric_cast</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">public</span><span class="special">:</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()
|
||||
</span> <span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="string">"bad numeric conversion: overflow"</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="special">};</span>
|
||||
|
||||
<a name="numeric_conversion_negative_overflow"></a>
|
||||
|
||||
<span class="keyword">class</span> <span class="identifier">negative_overflow</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">bad_numeric_cast</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">public</span><span class="special">:</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()
|
||||
</span> <span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="string">"bad numeric conversion: negative overflow"</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<a name="numeric_conversion_possitive_overflow"></a>
|
||||
|
||||
<span class="keyword">class</span> <span class="identifier">positive_overflow</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">bad_numeric_cast</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">public</span><span class="special">:</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keyword">char</span> <span class="special">*</span><span class="identifier">what</span><span class="special">()</span> <span class="keyword">const</span> <span class="comment">// throw()
|
||||
</span> <span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="string">"bad numeric conversion: positive overflow"</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
@@ -136,14 +161,14 @@
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span>
|
||||
</pre>
|
||||
<a name="numeric_conversion_policy_overflow_handler_important_note"></a>
|
||||
<div class="important"><table border="0" summary="Important">
|
||||
<a name="numeric_conversion_policy_overflow_handler_important_note"></a><p>
|
||||
</p>
|
||||
<div class="important"><table border="0" summary="Important">
|
||||
<tr>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/html/images/important.png"></td>
|
||||
<th align="left">Important</th>
|
||||
</tr>
|
||||
<tr><td align="left" valign="top">
|
||||
<p>
|
||||
<tr><td align="left" valign="top"><p>
|
||||
<span class="bold"><strong>RELEASE NOTE for 1.33</strong></span> Previous to boost
|
||||
version 1.33, the exception class <code class="computeroutput"><span class="identifier">bad_numeric_cast</span></code>
|
||||
was named <code class="computeroutput"><span class="identifier">bad_numeric_conversion</span></code>.
|
||||
@@ -155,27 +180,29 @@
|
||||
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).
|
||||
</p>
|
||||
</td></tr>
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_policy_float_to_int_rounder"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder"></a><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder" title="Policy Float2IntRounder">Policy
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder"></a><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder" title="Policy
|
||||
Float2IntRounder">Policy
|
||||
Float2IntRounder</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
This <span class="emphasis"><em>stateless</em></span> template policy class specifies the rounding
|
||||
mode used for <span class="underline">float to integral</span> conversions.
|
||||
It supplies the <code class="computeroutput"><span class="identifier">nearbyint</span><span class="special">()</span></code> static member function exposed by the converter,
|
||||
which means that it <span class="underline">publicly inherits from this
|
||||
policy</span>.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The policy must have the following interface:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">YourFloat2IntRounderPolicy</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">S</span> <span class="identifier">source_type</span> <span class="special">;</span>
|
||||
@@ -187,24 +214,23 @@
|
||||
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
These are the rounder classes provided by the library (only the specific
|
||||
parts are shown, see the general policy form above)
|
||||
</p>
|
||||
<div class="note"><table border="0" summary="Note">
|
||||
<div class="note"><table border="0" summary="Note">
|
||||
<tr>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
|
||||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/html/images/note.png"></td>
|
||||
<th align="left">Note</th>
|
||||
</tr>
|
||||
<tr><td align="left" valign="top">
|
||||
<p>
|
||||
<tr><td align="left" valign="top"><p>
|
||||
These classes are not intended to be general purpose rounding functions
|
||||
but specific policies for <code class="computeroutput"><span class="identifier">converter</span><span class="special"><></span></code>. This is why they are not function
|
||||
objects.
|
||||
</p>
|
||||
</td></tr>
|
||||
</p></td></tr>
|
||||
</table></div>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
@@ -258,48 +284,51 @@
|
||||
<span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">float_round_style</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">round_toward_neg_infinity</span><span class="special">></span> <span class="identifier">round_style</span> <span class="special">;</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, namespace boost</span>
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.h0"></a>
|
||||
<span><a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.math_functions_used_by_the_rounder_policies"></a></span><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.math_functions_used_by_the_rounder_policies">Math
|
||||
<span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, namespace boost
|
||||
</span></pre>
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.math_functions_used_by_the_rounder_policies"></a><h5>
|
||||
<a name="id2634042"></a>
|
||||
<a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.math_functions_used_by_the_rounder_policies">Math
|
||||
Functions used by the rounder policies</a>
|
||||
</h5>
|
||||
<p>
|
||||
<p>
|
||||
The rounder policies supplied by this header use math functions <code class="computeroutput"><span class="identifier">floor</span><span class="special">()</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">ceil</span><span class="special">()</span></code>.
|
||||
The standard versions of these functions are introduced in context by a using
|
||||
directive, so in normal conditions, the standard functions will be used.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
This technique allows the default rounder policies to be used directly with
|
||||
user defined types. The user only requires that suitable overloads of <code class="computeroutput"><span class="identifier">floor</span><span class="special">()</span></code>
|
||||
and <code class="computeroutput"><span class="identifier">ceil</span><span class="special">()</span></code>
|
||||
be visible. See also <a class="link" href="type_requirements_and_user_defined_types_support.html" title="Type Requirements and User-defined-types support">User
|
||||
be visible. See also <a href="../index.html#numeric_conversion_requirements">User
|
||||
Defined Numeric Types</a> support.
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_policy_raw_converter"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter"></a><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter" title="Policy RawConverter">Policy
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter"></a><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter" title="Policy
|
||||
RawConverter">Policy
|
||||
RawConverter</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
This <span class="emphasis"><em>stateless</em></span> template policy class is used to perform
|
||||
the actual conversion from Source to Target. It supplies the <code class="computeroutput"><span class="identifier">low_level_convert</span><span class="special">()</span></code>
|
||||
static member function exposed by the converter, which means that it publicly
|
||||
inherits from this policy.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The policy must have the following interface:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">YourRawConverterPolicy</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">::</span><span class="identifier">result_type</span> <span class="identifier">result_type</span> <span class="special">;</span>
|
||||
@@ -308,15 +337,16 @@
|
||||
<span class="keyword">static</span> <span class="identifier">result_type</span> <span class="identifier">low_level_convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special"><</span><span class="identifier">impl</span> <span class="identifier">defined</span><span class="special">></span> <span class="special">;</span> <span class="special">}</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
This policy is mostly provided as a hook for user defined types which don't
|
||||
support <code class="computeroutput"><span class="keyword">static_cast</span><span class="special"><></span></code>
|
||||
conversions to some types
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
This is the only raw converter policy class provided by the library:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">raw_numeric_converter</span>
|
||||
@@ -326,62 +356,69 @@
|
||||
|
||||
<span class="keyword">static</span> <span class="identifier">result_type</span> <span class="identifier">low_level_convert</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">result_type</span><span class="special">>(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">result_type</span><span class="special">>(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
|
||||
<span class="special">}</span> <span class="special">}</span>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_policy_user_range_checker"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker"></a><a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker" title="Policy UserRangeChecker">Policy
|
||||
<a name="boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker"></a><a href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker" title="Policy
|
||||
UserRangeChecker">Policy
|
||||
UserRangeChecker</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
This <span class="emphasis"><em>stateless</em></span> template policy class is used <span class="underline">only if supplied</span> to <span class="bold"><strong>override</strong></span>
|
||||
the internal range checking logic.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
It supplies the <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code> static member function exposed by the converter,
|
||||
which means that it publicly inherits from this policy.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The policy must have the following interface:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">></span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">YourRangeCheckerPolicy</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">::</span><span class="identifier">argument_type</span> <span class="identifier">argument_type</span> <span class="special">;</span>
|
||||
|
||||
<span class="comment">// Determines if the value 's' fits in the range of the Target type.</span>
|
||||
<span class="keyword">static</span> <span class="identifier">range_check_result</span> <span class="identifier">out_of_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="comment">// Determines if the value 's' fits in the range of the Target type.
|
||||
</span> <span class="keyword">static</span> <span class="identifier">range_check_result</span> <span class="identifier">out_of_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span> <span class="special">;</span>
|
||||
|
||||
<span class="comment">// Checks whether the value 's' is out_of_range()</span>
|
||||
<span class="comment">// and passes the result of the check to the OverflowHandler policy.</span>
|
||||
<span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">validate_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="comment">// Checks whether the value 's' is out_of_range()
|
||||
</span> <span class="comment">// and passes the result of the check to the OverflowHandler policy.
|
||||
</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">validate_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">OverflowHandler</span><span class="special">()(</span> <span class="identifier">out_of_range</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">)</span> <span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">}</span> <span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
This policy is <span class="bold"><strong>only</strong></span> 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: <code class="computeroutput"><span class="identifier">UseInternalRangeChecker</span><span class="special">{}</span></code>; which is a <span class="emphasis"><em>fake</em></span>
|
||||
<code class="computeroutput"><span class="identifier">RangeChecker</span></code> policy used
|
||||
to signal the converter to use its internal range checking implementation.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="conversion_traits___traits_class.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="improved_numeric_cast__.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+96
-465
@@ -1,55 +1,69 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Type Requirements and User-defined-types support</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Type
|
||||
Requirements and User-defined-types support</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="converter___function_object.html" title="converter<>
|
||||
function object">
|
||||
<link rel="next" href="bounds___traits_class.html" title="bounds<>
|
||||
traits class">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="converter___function_object.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bounds___traits_class.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support"></a><a class="link" href="type_requirements_and_user_defined_types_support.html" title="Type Requirements and User-defined-types support">Type
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support"></a><a href="type_requirements_and_user_defined_types_support.html" title="Type
|
||||
Requirements and User-defined-types support">Type
|
||||
Requirements and User-defined-types support</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="section">
|
||||
<div class="toc"><dl>
|
||||
<dt><span class="section"><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.type_requirements">Type
|
||||
Requirements</a></span></dt>
|
||||
<dt><span class="section"><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics">UDT's
|
||||
special semantics</a></span></dt>
|
||||
<dt><span class="section"><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies">Special
|
||||
Policies</a></span></dt>
|
||||
</dl></div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.type_requirements"></a><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.type_requirements" title="Type Requirements">Type
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.type_requirements"></a><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.type_requirements" title="Type
|
||||
Requirements">Type
|
||||
Requirements</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
Both arithmetic (built-in) and user-defined numeric types require proper
|
||||
specialization of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><></span></code>
|
||||
(that is, with (in-class) integral constants).
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The library uses <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_specialized</span></code> to detect whether the type
|
||||
is builtin or user defined, and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_integer</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_signed</span></code> to detect whether the type is
|
||||
integer or floating point; and whether it is signed/unsigned.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The default <code class="computeroutput"><span class="identifier">Float2IntRounder</span></code>
|
||||
policies uses unqualified calls to functions <code class="computeroutput"><span class="identifier">floor</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">ceil</span><span class="special">()</span></code>; but the standard functions are introduced
|
||||
in scope by a using directive:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">floor</span> <span class="special">;</span> <span class="keyword">return</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span>
|
||||
<pre class="programlisting">
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">floor</span> <span class="special">;</span> <span class="keyword">return</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">s</span><span class="special">);</span>
|
||||
</pre>
|
||||
<p>
|
||||
<p>
|
||||
Therefore, for builtin arithmetic types, the std functions will be used.
|
||||
User defined types should provide overloaded versions of these functions
|
||||
in order to use the default rounder policies. If these overloads are defined
|
||||
@@ -57,510 +71,127 @@
|
||||
but if your compiler has a weak ADL you might need to put these functions
|
||||
some place else or write your own rounder policy.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The default <code class="computeroutput"><span class="identifier">Trunc</span><span class="special"><></span></code>
|
||||
rounder policy needs to determine if the source value is positive or not,
|
||||
and for this it evaluates the expression <code class="computeroutput"><span class="identifier">s</span>
|
||||
<span class="special"><</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">S</span><span class="special">>(</span><span class="number">0</span><span class="special">)</span></code>. Therefore,
|
||||
user defined types require a visible <code class="computeroutput"><span class="keyword">operator</span><span class="special"><</span></code> in order to use the <code class="computeroutput"><span class="identifier">Trunc</span><span class="special"><></span></code> policy (the default).
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics"></a><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics" title="UDT's special semantics">UDT's
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics"></a><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics" title="UDT's
|
||||
special semantics">UDT's
|
||||
special semantics</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<h5>
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.h0"></a>
|
||||
<span><a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.conversion_traits"></a></span><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.conversion_traits">Conversion
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.conversion_traits"></a><h5>
|
||||
<a name="id2625386"></a>
|
||||
<a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.conversion_traits">Conversion
|
||||
Traits</a>
|
||||
</h5>
|
||||
<p>
|
||||
<p>
|
||||
If a User Defined Type is involved in a conversion, it is <span class="emphasis"><em>assumed</em></span>
|
||||
that the UDT has <a class="link" href="definitions.html#boost_numericconversion.definitions.range_and_precision" title="Range and Precision">wider
|
||||
that the UDT has <a href="definitions.html#numeric_conversion_definitions_range">wider
|
||||
range</a> than any built-in type, and consequently the values of some
|
||||
<code class="computeroutput"><span class="identifier">converter_traits</span><span class="special"><></span></code>
|
||||
members are hardwired regardless of the reality. The following table summarizes
|
||||
this:
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>built-in</em></span>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">false</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Target</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Source</span></code>
|
||||
|
||||
</li>
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>built-in</em></span><div class="itemizedlist"><ul type="circle">
|
||||
<li><code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">false</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Target</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Source</span></code></li>
|
||||
</ul></div>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>built-in</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">true</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Source</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Target</span></code>
|
||||
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>built-in</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span><div class="itemizedlist"><ul type="circle">
|
||||
<li><code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">true</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Source</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Target</span></code></li>
|
||||
</ul></div>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">false</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Target</span></code>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
<code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Source</span></code>
|
||||
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
<code class="computeroutput"><span class="identifier">Target</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span>
|
||||
and <code class="computeroutput"><span class="identifier">Source</span><span class="special">=</span></code><span class="emphasis"><em>UDT</em></span><div class="itemizedlist"><ul type="circle">
|
||||
<li><code class="computeroutput"><span class="identifier">subranged</span><span class="special">=</span><span class="keyword">false</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">supertype</span><span class="special">=</span><span class="identifier">Target</span></code></li>
|
||||
<li><code class="computeroutput"><span class="identifier">subtype</span><span class="special">=</span><span class="identifier">Source</span></code></li>
|
||||
</ul></div>
|
||||
|
||||
</li>
|
||||
</li>
|
||||
</ul></div>
|
||||
<p>
|
||||
<p>
|
||||
The <code class="computeroutput"><span class="identifier">Traits</span></code> member <code class="computeroutput"><span class="identifier">udt_mixture</span></code> can be used to detect whether
|
||||
a UDT is involved and to infer the validity of the other members as shown
|
||||
above.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.h1"></a>
|
||||
<span><a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.range_checking"></a></span><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.range_checking">Range
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.range_checking"></a><h5>
|
||||
<a name="id2625806"></a>
|
||||
<a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.range_checking">Range
|
||||
Checking</a>
|
||||
</h5>
|
||||
<p>
|
||||
<p>
|
||||
Because User Defined Numeric Types might have peculiar ranges (such as an
|
||||
unbounded range), this library does not attempt to supply a meaningful range
|
||||
checking logic when UDTs are involved in a conversion. Therefore, if either
|
||||
Target or Source are not built-in types, the bundled range checking of the
|
||||
<code class="computeroutput"><span class="identifier">converter</span><span class="special"><></span></code>
|
||||
function object is automatically disabled. However, it is possible to supply
|
||||
a user-defined range-checker. See <a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies" title="Special Policies">Special
|
||||
a user-defined range-checker. See <a href="type_requirements_and_user_defined_types_support.html#numeric_conversion_requirements_hooks">Special
|
||||
Policies</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
</div>
|
||||
<a name="numeric_conversion_requirements_hooks"></a><p>
|
||||
</p>
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies"></a><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies" title="Special Policies">Special
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies"></a><a href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies" title="Special
|
||||
Policies">Special
|
||||
Policies</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
There are two components of the <code class="computeroutput"><span class="identifier">converter</span><span class="special"><></span></code> class that might require special
|
||||
behavior if User Defined Numeric Types are involved: the Range Checking and
|
||||
the Raw Conversion.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
When both Target and Source are built-in types, the converter class uses
|
||||
an internal range checking logic which is optimized and customized for the
|
||||
combined properties of the types.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
However, this internal logic is disabled when either type is User Defined.
|
||||
In this case, the user can specify an <span class="emphasis"><em>external</em></span> range
|
||||
checking policy which will be used in place of the internal code. See <a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast" title="UDTs with numeric_cast">numeric_cast_traits</a>
|
||||
for details on using UDTs with <code class="computeroutput"><span class="identifier">numeric_cast</span></code>.
|
||||
checking policy which will be used in place of the internal code. See <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_user_range_checker">UserRangeChecker</a>
|
||||
policy for details.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
The converter class performs the actual conversion using a Raw Converter
|
||||
policy. The default raw converter simply performs a <code class="computeroutput"><span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">Target</span><span class="special">>(</span><span class="identifier">source</span><span class="special">)</span></code>.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
However, if the a UDT is involved, the <code class="computeroutput"><span class="keyword">static_cast</span></code>
|
||||
might not work. In this case, the user can implement and pass a different
|
||||
raw converter policy. See <a class="link" href="numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter" title="Policy RawConverter">RawConverter</a>
|
||||
policy for details.
|
||||
raw converter policy. See <a href="numeric_converter_policy_classes.html#numeric_conversion_policy_raw_converter">RawConverter</a>
|
||||
policy for details
|
||||
</p>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast"></a><a class="link" href="type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast" title="UDTs with numeric_cast">UDTs
|
||||
with numeric_cast</a>
|
||||
</h3></div></div></div>
|
||||
|
||||
<p>
|
||||
In order to employ UDTs with <code class="computeroutput"><span class="identifier">numeric_cast</span></code>,
|
||||
the user should define a <code class="computeroutput"><span class="identifier">numeric_cast_traits</span></code>
|
||||
specialization on the UDT for each conversion. Here is an example of specializations
|
||||
for converting between the UDT and any other type:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Source</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">numeric_cast_traits</span><span class="special"><</span><span class="identifier">UDT</span><span class="special">,</span> <span class="identifier">Source</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">conversion_traits</span><span class="special"><</span><span class="identifier">UDT</span><span class="special">,</span> <span class="identifier">Source</span><span class="special">></span> <span class="identifier">conv_traits</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">//! The following are required:</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourOverflowHandlerPolicy</span> <span class="identifier">overflow_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourRangeCheckerPolicy</span><span class="special"><</span><span class="identifier">conv_traits</span><span class="special">></span> <span class="identifier">range_checking_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourFloat2IntRounderPolicy</span><span class="special"><</span><span class="identifier">Source</span><span class="special">></span> <span class="identifier">rounding_policy</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Target</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">numeric_cast_traits</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> <span class="identifier">UDT</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">conversion_traits</span><span class="special"><</span><span class="identifier">Target</span><span class="special">,</span> <span class="identifier">UDT</span><span class="special">></span> <span class="identifier">conv_traits</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">//! The following are required:</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourOverflowHandlerPolicy</span> <span class="identifier">overflow_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourRangeCheckerPolicy</span><span class="special"><</span><span class="identifier">conv_traits</span><span class="special">></span> <span class="identifier">range_checking_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">YourFloat2IntRounderPolicy</span><span class="special"><</span><span class="identifier">UDT</span><span class="special">></span> <span class="identifier">rounding_policy</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
<span class="special">}}//</span><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">;</span>
|
||||
</pre>
|
||||
<p>
|
||||
These specializations are already defined with default values for the built-in
|
||||
numeric types. It is possible to disable the generation of specializations
|
||||
for built-in types by defining <code class="computeroutput"><span class="identifier">BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS</span></code>.
|
||||
For details on defining custom policies see <a class="link" href="numeric_converter_policy_classes.html" title="Numeric Converter Policy Classes">Converter
|
||||
Policies</a>.
|
||||
</p>
|
||||
<p>
|
||||
Here is a full example of how to define a custom UDT for use with <code class="computeroutput"><span class="identifier">numeric_cast</span></code>:
|
||||
</p>
|
||||
<pre class="programlisting"><span class="comment">//! Define a simple custom number</span>
|
||||
<span class="keyword">struct</span> <span class="identifier">Double</span>
|
||||
<span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">Double</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">long</span> <span class="keyword">double</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">double</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">float</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">int</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">int</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">long</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">long</span> <span class="keyword">long</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">long</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">char</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">char</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">short</span>
|
||||
<span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ordered_field_operators2</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">short</span>
|
||||
<span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span> <span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">Double</span><span class="special">()</span>
|
||||
<span class="special">:</span> <span class="identifier">v</span><span class="special">(</span><span class="number">0</span><span class="special">)</span>
|
||||
<span class="special">{}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">explicit</span> <span class="identifier">Double</span><span class="special">(</span> <span class="identifier">T</span> <span class="identifier">v</span> <span class="special">)</span>
|
||||
<span class="special">:</span> <span class="identifier">v</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">v</span><span class="special">))</span>
|
||||
<span class="special">{}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="identifier">T</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special"><</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special"><</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special"><</span> <span class="special">(</span> <span class="identifier">T</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special"><</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">rhs</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">></span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special">></span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">></span> <span class="special">(</span> <span class="identifier">T</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special">></span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">rhs</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special">==</span> <span class="identifier">rhs</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">==</span> <span class="special">(</span> <span class="identifier">T</span> <span class="identifier">rhs</span> <span class="special">)</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special">==</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">rhs</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">bool</span> <span class="keyword">operator</span> <span class="special">!()</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">v</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="identifier">Double</span> <span class="keyword">operator</span> <span class="special">-()</span> <span class="keyword">const</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(-</span><span class="identifier">v</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">+=</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=(</span> <span class="identifier">T</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">+=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">-=(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">-=</span> <span class="identifier">t</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">-=(</span> <span class="identifier">T</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">-=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">*=</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">factor</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">*=</span> <span class="identifier">factor</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">*=(</span> <span class="identifier">T</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">*=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">/=</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">divisor</span><span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">/=</span> <span class="identifier">divisor</span><span class="special">.</span><span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="identifier">Double</span><span class="special">&</span> <span class="keyword">operator</span> <span class="special">/=(</span> <span class="identifier">T</span> <span class="identifier">t</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">v</span> <span class="special">/=</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">double</span><span class="special">>(</span><span class="identifier">t</span><span class="special">);</span>
|
||||
<span class="keyword">return</span> <span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">double</span> <span class="identifier">v</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="comment">//! Define numeric_limits for the custom type.</span>
|
||||
<span class="keyword">namespace</span> <span class="identifier">std</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">template</span><span class="special"><></span>
|
||||
<span class="keyword">class</span> <span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">Double</span><span class="special">></span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">public</span><span class="special">:</span>
|
||||
|
||||
<span class="comment">//! Limit our Double to a range of +/- 100.0</span>
|
||||
<span class="keyword">static</span> <span class="identifier">Double</span> <span class="special">(</span><span class="identifier">min</span><span class="special">)()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span><span class="number">1.e-2</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="identifier">Double</span> <span class="special">(</span><span class="identifier">max</span><span class="special">)()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span><span class="number">1.e2</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="identifier">Double</span> <span class="identifier">epsilon</span><span class="special">()</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">epsilon</span><span class="special">()</span> <span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="comment">//! Define range checking and overflow policies.</span>
|
||||
<span class="keyword">namespace</span> <span class="identifier">custom</span>
|
||||
<span class="special">{</span>
|
||||
<span class="comment">//! Define a custom range checker</span>
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">OverFlowHandler</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">range_checker</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">::</span><span class="identifier">argument_type</span> <span class="identifier">argument_type</span> <span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">::</span><span class="identifier">source_type</span> <span class="identifier">S</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Traits</span><span class="special">::</span><span class="identifier">target_type</span> <span class="identifier">T</span><span class="special">;</span>
|
||||
|
||||
<span class="comment">//! Check range of integral types.</span>
|
||||
<span class="keyword">static</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">range_check_result</span> <span class="identifier">out_of_range</span><span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span> <span class="identifier">s</span> <span class="special">></span> <span class="identifier">bounds</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">highest</span><span class="special">()</span> <span class="special">)</span>
|
||||
<span class="keyword">return</span> <span class="identifier">cPosOverflow</span><span class="special">;</span>
|
||||
<span class="keyword">else</span> <span class="keyword">if</span><span class="special">(</span> <span class="identifier">s</span> <span class="special"><</span> <span class="identifier">bounds</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">lowest</span><span class="special">()</span> <span class="special">)</span>
|
||||
<span class="keyword">return</span> <span class="identifier">cNegOverflow</span><span class="special">;</span>
|
||||
<span class="keyword">else</span>
|
||||
<span class="keyword">return</span> <span class="identifier">cInRange</span><span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="keyword">void</span> <span class="identifier">validate_range</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_bounded</span> <span class="special">);</span>
|
||||
<span class="identifier">OverFlowHandler</span><span class="special">()(</span> <span class="identifier">out_of_range</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="comment">//! Overflow handler</span>
|
||||
<span class="keyword">struct</span> <span class="identifier">positive_overflow</span><span class="special">{};</span>
|
||||
<span class="keyword">struct</span> <span class="identifier">negative_overflow</span><span class="special">{};</span>
|
||||
|
||||
<span class="keyword">struct</span> <span class="identifier">overflow_handler</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()</span> <span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">range_check_result</span> <span class="identifier">r</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">;</span>
|
||||
<span class="keyword">if</span><span class="special">(</span> <span class="identifier">r</span> <span class="special">==</span> <span class="identifier">cNegOverflow</span> <span class="special">)</span>
|
||||
<span class="keyword">throw</span> <span class="identifier">negative_overflow</span><span class="special">()</span> <span class="special">;</span>
|
||||
<span class="keyword">else</span> <span class="keyword">if</span><span class="special">(</span> <span class="identifier">r</span> <span class="special">==</span> <span class="identifier">cPosOverflow</span> <span class="special">)</span>
|
||||
<span class="keyword">throw</span> <span class="identifier">positive_overflow</span><span class="special">()</span> <span class="special">;</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="comment">//! Define a rounding policy and specialize on the custom type.</span>
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">Ceil</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">Ceil</span><span class="special"><</span><span class="identifier">S</span><span class="special">>{};</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">Ceil</span><span class="special"><</span><span class="identifier">Double</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">Double</span> <span class="identifier">source_type</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">Double</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">argument_type</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="identifier">source_type</span> <span class="identifier">nearbyint</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_NO_STDC_NAMESPACE</span><span class="special">)</span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ceil</span> <span class="special">;</span>
|
||||
<span class="preprocessor">#endif</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">v</span><span class="special">)</span> <span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">float_round_style</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">round_toward_infinity</span><span class="special">></span> <span class="identifier">round_style</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="comment">//! Define a rounding policy and specialize on the custom type.</span>
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">Trunc</span><span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">Trunc</span><span class="special"><</span><span class="identifier">S</span><span class="special">>{};</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">Trunc</span><span class="special"><</span><span class="identifier">Double</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">Double</span> <span class="identifier">source_type</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">Double</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">argument_type</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">static</span> <span class="identifier">source_type</span> <span class="identifier">nearbyint</span> <span class="special">(</span> <span class="identifier">argument_type</span> <span class="identifier">s</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_NO_STDC_NAMESPACE</span><span class="special">)</span>
|
||||
<span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">floor</span><span class="special">;</span>
|
||||
<span class="preprocessor">#endif</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">v</span><span class="special">)</span> <span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">float_round_style</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">round_toward_zero</span><span class="special">></span> <span class="identifier">round_style</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
<span class="special">}//</span><span class="keyword">namespace</span> <span class="identifier">custom</span><span class="special">;</span>
|
||||
|
||||
<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span>
|
||||
|
||||
<span class="comment">//! Define the numeric_cast_traits specializations on the custom type.</span>
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">numeric_cast_traits</span><span class="special"><</span><span class="identifier">Double</span><span class="special">,</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">custom</span><span class="special">::</span><span class="identifier">overflow_handler</span> <span class="identifier">overflow_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">custom</span><span class="special">::</span><span class="identifier">range_checker</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="identifier">Double</span><span class="special">,</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="special">,</span> <span class="identifier">overflow_policy</span>
|
||||
<span class="special">></span> <span class="identifier">range_checking_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">Trunc</span><span class="special"><</span><span class="identifier">S</span><span class="special">></span> <span class="identifier">rounding_policy</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">numeric_cast_traits</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Double</span><span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">custom</span><span class="special">::</span><span class="identifier">overflow_handler</span> <span class="identifier">overflow_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">custom</span><span class="special">::</span><span class="identifier">range_checker</span>
|
||||
<span class="special"><</span>
|
||||
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">conversion_traits</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Double</span><span class="special">></span>
|
||||
<span class="special">,</span> <span class="identifier">overflow_policy</span>
|
||||
<span class="special">></span> <span class="identifier">range_checking_policy</span><span class="special">;</span>
|
||||
<span class="keyword">typedef</span> <span class="identifier">custom</span><span class="special">::</span><span class="identifier">Trunc</span><span class="special"><</span><span class="identifier">Double</span><span class="special">></span> <span class="identifier">rounding_policy</span><span class="special">;</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="comment">//! Define the conversion from the custom type to built-in types and vice-versa.</span>
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">raw_converter</span><span class="special"><</span> <span class="identifier">conversion_traits</span><span class="special"><</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">Double</span> <span class="special">></span> <span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">static</span> <span class="identifier">T</span> <span class="identifier">low_level_convert</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Double</span><span class="special">&</span> <span class="identifier">n</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span> <span class="identifier">n</span><span class="special">.</span><span class="identifier">v</span> <span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">S</span><span class="special">></span>
|
||||
<span class="keyword">struct</span> <span class="identifier">raw_converter</span><span class="special"><</span> <span class="identifier">conversion_traits</span><span class="special"><</span> <span class="identifier">Double</span><span class="special">,</span> <span class="identifier">S</span> <span class="special">></span> <span class="special">></span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">static</span> <span class="identifier">Double</span> <span class="identifier">low_level_convert</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">S</span><span class="special">&</span> <span class="identifier">n</span> <span class="special">)</span>
|
||||
<span class="special">{</span>
|
||||
<span class="keyword">return</span> <span class="identifier">Double</span><span class="special">(</span><span class="identifier">n</span><span class="special">);</span>
|
||||
<span class="special">}</span>
|
||||
<span class="special">};</span>
|
||||
<span class="special">}}//</span><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">;</span>
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="converter___function_object.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bounds___traits_class.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+59
-73
@@ -1,38 +1,37 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>Chapter 1. Boost.NumericConversion</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Chapter 1. Boost.NumericConversion</title>
|
||||
<link rel="stylesheet" href="boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="next" href="boost_numericconversion/definitions.html" title="Definitions">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav"></div>
|
||||
<div class="chapter">
|
||||
<div class="spirit-nav"><a accesskey="n" href="boost_numericconversion/definitions.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a></div>
|
||||
<div class="chapter" lang="en">
|
||||
<div class="titlepage"><div>
|
||||
<div><h2 class="title">
|
||||
<a name="numeric_conversion"></a>Chapter 1. Boost.NumericConversion</h2></div>
|
||||
<a name="numeric_conversion"></a>Chapter 1. Boost.NumericConversion</h2></div>
|
||||
<div><div class="author"><h3 class="author">
|
||||
<span class="firstname">Fernando Luis</span> <span class="surname">Cacciola Carballal</span>
|
||||
</h3></div></div>
|
||||
<div><p class="copyright">Copyright © 2004-2007 Fernando
|
||||
Luis Cacciola Carballal</p></div>
|
||||
<div><p class="copyright">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal</p></div>
|
||||
<div><div class="legalnotice">
|
||||
<a name="numeric_conversion.legal"></a>
|
||||
<p>
|
||||
<a name="id2604942"></a><p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a class="ulink" href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></div>
|
||||
</div></div>
|
||||
</div></div>
|
||||
<div class="toc">
|
||||
<p><b>Table of Contents</b></p>
|
||||
@@ -77,8 +76,6 @@
|
||||
special semantics</a></span></dt>
|
||||
<dt><span class="section"><a href="boost_numericconversion/type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies">Special
|
||||
Policies</a></span></dt>
|
||||
<dt><span class="section"><a href="boost_numericconversion/type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast">UDTs
|
||||
with numeric_cast</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="boost_numericconversion/bounds___traits_class.html">bounds<>
|
||||
traits class</a></span></dt>
|
||||
@@ -113,7 +110,6 @@
|
||||
<dd><dl>
|
||||
<dt><span class="section"><a href="boost_numericconversion/improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.introduction">Introduction</a></span></dt>
|
||||
<dt><span class="section"><a href="boost_numericconversion/improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast">numeric_cast</a></span></dt>
|
||||
<dt><span class="section"><a href="boost_numericconversion/improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.numeric_cast_traits">numeric_cast_traits</a></span></dt>
|
||||
<dt><span class="section"><a href="boost_numericconversion/improved_numeric_cast__.html#boost_numericconversion.improved_numeric_cast__.examples">Examples</a></span></dt>
|
||||
</dl></dd>
|
||||
<dt><span class="section"><a href="numeric_conversion/history_and_acknowledgments.html">History
|
||||
@@ -121,81 +117,71 @@
|
||||
<dt><span class="section"><a href="numeric_conversion/bibliography.html">Bibliography</a></span></dt>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="numeric_conversion.overview"></a><a class="link" href="index.html#numeric_conversion.overview" title="Overview">Overview</a>
|
||||
<a name="numeric_conversion.overview"></a><a href="index.html#numeric_conversion.overview" title="Overview">Overview</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<p>
|
||||
<p>
|
||||
The Boost Numeric Conversion library is a collection of tools to describe and
|
||||
perform conversions between values of different <a class="link" href="boost_numericconversion/definitions.html#boost_numericconversion.definitions.numeric_types" title="Numeric Types">numeric
|
||||
perform conversions between values of different <a href="boost_numericconversion/definitions.html#numeric_conversion_definitions_numeric_types">numeric
|
||||
types</a>.
|
||||
</p>
|
||||
<p>
|
||||
The library includes a special alternative for a subset of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><></span></code>, the <a class="link" href="boost_numericconversion/bounds___traits_class.html" title="bounds<> traits class">bounds<></a>
|
||||
traits class, which provides a consistent way to obtain the <a class="link" href="boost_numericconversion/definitions.html#boost_numericconversion.definitions.range_and_precision" title="Range and Precision">boundary</a>
|
||||
values for the <a class="link" href="boost_numericconversion/definitions.html#boost_numericconversion.definitions.range_and_precision" title="Range and Precision">range</a>
|
||||
<p>
|
||||
The library includes a special alternative for a subset of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><></span></code>, the <a href="index.html#numeric_conversion_bounds">bounds<></a>
|
||||
traits class, which provides a consistent way to obtain the <a href="boost_numericconversion/definitions.html#numeric_conversion_definitions_range">boundary</a>
|
||||
values for the <a href="boost_numericconversion/definitions.html#numeric_conversion_definitions_range">range</a>
|
||||
of a numeric type.
|
||||
</p>
|
||||
<p>
|
||||
It also includes a set of <a class="link" href="boost_numericconversion/conversion_traits___traits_class.html" title="conversion_traits<> traits class">trait
|
||||
classes</a> which describes the compile-time properties of a conversion
|
||||
from a source to a target numeric type. Both <a class="link" href="boost_numericconversion/definitions.html#boost_numericconversion.definitions.c___arithmetic_types" title="C++ Arithmetic Types">arithmetic</a>
|
||||
and <a class="link" href="boost_numericconversion/definitions.html#boost_numericconversion.definitions.numeric_types" title="Numeric Types">user-defined
|
||||
<p>
|
||||
It also includes a set of <a href="index.html#numeric_conversion_traits">trait classes</a>
|
||||
which describes the compile-time properties of a conversion from a source to
|
||||
a target numeric type. Both <a href="boost_numericconversion/definitions.html#numeric_conversion_cpp_arithmetic_types">arithmetic</a>
|
||||
and <a href="boost_numericconversion/definitions.html#numeric_conversion_definitions_numeric_types">user-defined
|
||||
numeric types</a> can be used.
|
||||
</p>
|
||||
<p>
|
||||
A policy-based <a class="link" href="boost_numericconversion/converter___function_object.html" title="converter<> function object">converter</a>
|
||||
<p>
|
||||
A policy-based <a href="index.html#numeric_conversion_converter">converter</a>
|
||||
object which uses <code class="computeroutput"><span class="identifier">conversion_traits</span></code>
|
||||
to select an optimized implementation is supplied. Such implementation uses
|
||||
an optimal range checking code suitable for the source/target combination.
|
||||
</p>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
The converter's out-of-range behavior can be customized via an <a class="link" href="boost_numericconversion/numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler" title="Policy OverflowHandler">OverflowHandler</a>
|
||||
policy.
|
||||
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
The converter's out-of-range behavior can be customized via an <a href="boost_numericconversion/numeric_converter_policy_classes.html#numeric_conversion_policy_overflow_handler">OverflowHandler</a>
|
||||
policy.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
For floating-point to integral conversions, the rounding mode can be selected
|
||||
via the <a class="link" href="boost_numericconversion/numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder" title="Policy Float2IntRounder">Float2IntRounder</a>
|
||||
policy.
|
||||
|
||||
<li>
|
||||
For floating-point to integral conversions, the rounding mode can be selected
|
||||
via the <a href="boost_numericconversion/numeric_converter_policy_classes.html#numeric_conversion_policy_float_to_int_rounder">Float2IntRounder</a>
|
||||
policy.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
A custom low-level conversion routine (for UDTs for instance) can be passed
|
||||
via a <a class="link" href="boost_numericconversion/numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter" title="Policy RawConverter">RawConverter</a>
|
||||
policy.
|
||||
|
||||
<li>
|
||||
A custom low-level conversion routine (for UDTs for instance) can be passed
|
||||
via a <a href="boost_numericconversion/numeric_converter_policy_classes.html#numeric_conversion_policy_raw_converter">RawConverter</a>
|
||||
policy.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
The optimized automatic range-checking logic can be overridden via a <a class="link" href="boost_numericconversion/numeric_converter_policy_classes.html#boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker" title="Policy UserRangeChecker">UserRangeChecker</a>
|
||||
policy.
|
||||
|
||||
<li>
|
||||
The optimized automatic range-checking logic can be overridden via a <a href="boost_numericconversion/numeric_converter_policy_classes.html#numeric_conversion_policy_user_range_checker">UserRangeChecker</a>
|
||||
policy.
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<a name="numeric_conversion_converter"></a><p>
|
||||
</p>
|
||||
<a name="numeric_conversion_requirements"></a><p>
|
||||
</p>
|
||||
<a name="numeric_conversion_bounds"></a><p>
|
||||
</p>
|
||||
<a name="numeric_conversion_traits"></a><p>
|
||||
</p>
|
||||
<a name="numeric_coversion_converter_policies"></a><p>
|
||||
</p>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"><p><small>Last revised: November 21, 2011 at 16:44:25 GMT</small></p></td>
|
||||
<td align="left"><p><small>Last revised: February 12, 2008 at 22:56:38 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav"></div>
|
||||
<div class="spirit-nav"><a accesskey="n" href="boost_numericconversion/definitions.html"><img src="../../../../../doc/html/images/next.png" alt="Next"></a></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,107 +1,87 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Bibliography</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="history_and_acknowledgments.html" title="History
|
||||
and Acknowledgments">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="history_and_acknowledgments.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="numeric_conversion.bibliography"></a><a class="link" href="bibliography.html" title="Bibliography">Bibliography</a>
|
||||
<a name="numeric_conversion.bibliography"></a><a href="bibliography.html" title="Bibliography">Bibliography</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
Standard Documents:
|
||||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||||
<li class="listitem">
|
||||
|
||||
ISO/IEC 14882:98 (C++98 Standard)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ISO/IEC 9899:1999 (C99 Standard)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ISO/IEC 10967-1 (Language Independent Arithmetic (LIA), Part I, 1994)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ISO/IEC 2382-1:1993 (Information Technology - Vocabulary - Part I:
|
||||
Fundamental Terms)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ANSI/IEEE 754-1985 [and IEC 60559:1989] (Binary floating-point)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ANSI/IEEE 854-1988 (Radix Independent floating-point)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ANSI X3/TR-1-82 (Dictionary for Information Processing Systems)
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
ISO/IEC JTC1/SC22/WG14/N753 C9X Revision Proposal: LIA-1 Binding:
|
||||
Rationale
|
||||
|
||||
</li>
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
Standard Documents:
|
||||
<div class="orderedlist"><ol type="1">
|
||||
<li>
|
||||
ISO/IEC 14882:98 (C++98 Standard)
|
||||
</li>
|
||||
<li>
|
||||
ISO/IEC 9899:1999 (C99 Standard)
|
||||
</li>
|
||||
<li>
|
||||
ISO/IEC 10967-1 (Language Independent Arithmetic (LIA), Part I, 1994)
|
||||
</li>
|
||||
<li>
|
||||
ISO/IEC 2382-1:1993 (Information Technology - Vocabulary - Part I: Fundamental
|
||||
Terms)
|
||||
</li>
|
||||
<li>
|
||||
ANSI/IEEE 754-1985 [and IEC 60559:1989] (Binary floating-point)
|
||||
</li>
|
||||
<li>
|
||||
ANSI/IEEE 854-1988 (Radix Independent floating-point)
|
||||
</li>
|
||||
<li>
|
||||
ANSI X3/TR-1-82 (Dictionary for Information Processing Systems)
|
||||
</li>
|
||||
<li>
|
||||
ISO/IEC JTC1/SC22/WG14/N753 C9X Revision Proposal: LIA-1 Binding: Rationale
|
||||
</li>
|
||||
</ol></div>
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Papers:
|
||||
<div class="orderedlist"><ol class="orderedlist" type="1">
|
||||
<li class="listitem">
|
||||
|
||||
David Goldberg What Every Computer Scientist Should Know About Floating-Point
|
||||
Arithmetic
|
||||
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Prof. William Kahan papers on floating-point.
|
||||
|
||||
</li>
|
||||
</li>
|
||||
<li>
|
||||
Papers:
|
||||
<div class="orderedlist"><ol type="1">
|
||||
<li>
|
||||
David Goldberg What Every Computer Scientist Should Know About Floating-Point
|
||||
Arithmetic
|
||||
</li>
|
||||
<li>
|
||||
Prof. William Kahan papers on floating-point.
|
||||
</li>
|
||||
</ol></div>
|
||||
|
||||
</li>
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="history_and_acknowledgments.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,105 +1,99 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||
<title>History and Acknowledgments</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>History
|
||||
and Acknowledgments</title>
|
||||
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.70.1">
|
||||
<link rel="start" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. Boost.NumericConversion">
|
||||
<link rel="prev" href="../boost_numericconversion/improved_numeric_cast__.html" title="Improved
|
||||
numeric_cast<>">
|
||||
<link rel="next" href="bibliography.html" title="Bibliography">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr>
|
||||
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
|
||||
<td align="center"><a href="../../../../../../index.html">Home</a></td>
|
||||
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../index.htm">Home</a></td>
|
||||
<td align="center"><a href="../../../../../libraries.htm">Libraries</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td>
|
||||
<td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td>
|
||||
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="../boost_numericconversion/improved_numeric_cast__.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="section" lang="en">
|
||||
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||
<a name="numeric_conversion.history_and_acknowledgments"></a><a class="link" href="history_and_acknowledgments.html" title="History and Acknowledgments">History
|
||||
<a name="numeric_conversion.history_and_acknowledgments"></a><a href="history_and_acknowledgments.html" title="History
|
||||
and Acknowledgments">History
|
||||
and Acknowledgments</a>
|
||||
</h2></div></div></div>
|
||||
|
||||
<h4>
|
||||
<a name="numeric_conversion.history_and_acknowledgments.h0"></a>
|
||||
<span><a name="numeric_conversion.history_and_acknowledgments.pre_formal_review"></a></span><a class="link" href="history_and_acknowledgments.html#numeric_conversion.history_and_acknowledgments.pre_formal_review">Pre-formal
|
||||
<a name="numeric_conversion.history_and_acknowledgments.pre_formal_review"></a><h4>
|
||||
<a name="id2636499"></a>
|
||||
<a href="history_and_acknowledgments.html#numeric_conversion.history_and_acknowledgments.pre_formal_review">Pre-formal
|
||||
review</a>
|
||||
</h4>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
Kevlin Henney, with help from David Abrahams and Beman Dawes, originally
|
||||
contributed the previous version of <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> which already presented the idea
|
||||
of a runtime range check.
|
||||
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
Kevlin Henney, with help from David Abrahams and Beman Dawes, originally
|
||||
contributed the previous version of <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> which already presented the idea
|
||||
of a runtime range check.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Later, Eric Ford, Kevin Lynch and the author spotted some genericity problems
|
||||
with that <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> which prevented it from being used
|
||||
in a generic layer of math functions.
|
||||
|
||||
<li>
|
||||
Later, Eric Ford, Kevin Lynch and the author spotted some genericity problems
|
||||
with that <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code>
|
||||
which prevented it from being used in a generic layer of math functions.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
An improved <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> which properly handled all combinations
|
||||
of arithmetic types was presented.
|
||||
|
||||
<li>
|
||||
An improved <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> which properly handled all combinations
|
||||
of arithmetic types was presented.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
David Abrahams and Beman Dawes acknowledged the need of an improved version
|
||||
of <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code>
|
||||
and supported the submission as originally laid out. Daryl Walker and Darin
|
||||
Adler made some important comments and proposed fixes to the original submission.
|
||||
|
||||
<li>
|
||||
David Abrahams and Beman Dawes acknowledged the need of an improved version
|
||||
of <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code>
|
||||
and supported the submission as originally laid out. Daryl Walker and Darin
|
||||
Adler made some important comments and proposed fixes to the original submission.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
Special thanks go to Björn Karlsoon who helped the author considerably.
|
||||
Having found the problems with <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> himself, he revised very carefully
|
||||
the original submission and spot a subtle bug in the range checking implementation.
|
||||
He also wrote part of this documentation and proof-read and corrected other
|
||||
parts. And most importantly: the features now presented here in this library
|
||||
evolved from the original submission as a result of the useful private
|
||||
communications between Björn and the author.
|
||||
|
||||
<li>
|
||||
Special thanks go to Björn Karlsoon who helped the author considerably.
|
||||
Having found the problems with <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special"><></span></code> himself, he revised very carefully
|
||||
the original submission and spot a subtle bug in the range checking implementation.
|
||||
He also wrote part of this documentation and proof-read and corrected other
|
||||
parts. And most importantly: the features now presented here in this library
|
||||
evolved from the original submission as a result of the useful private communications
|
||||
between Björn and the author.
|
||||
</li>
|
||||
</ul></div>
|
||||
<h4>
|
||||
<a name="numeric_conversion.history_and_acknowledgments.h1"></a>
|
||||
<span><a name="numeric_conversion.history_and_acknowledgments.post_formal_review"></a></span><a class="link" href="history_and_acknowledgments.html#numeric_conversion.history_and_acknowledgments.post_formal_review">Post-formal
|
||||
<a name="numeric_conversion.history_and_acknowledgments.post_formal_review"></a><h4>
|
||||
<a name="id2636651"></a>
|
||||
<a href="history_and_acknowledgments.html#numeric_conversion.history_and_acknowledgments.post_formal_review">Post-formal
|
||||
review</a>
|
||||
</h4>
|
||||
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||
<li class="listitem">
|
||||
|
||||
Guillaume Melquiond spoted some documentation and code issues, particularly
|
||||
about rounding conversions.
|
||||
|
||||
<div class="itemizedlist"><ul type="disc">
|
||||
<li>
|
||||
Guillaume Melquiond spoted some documentation and code issues, particularly
|
||||
about rounding conversions.
|
||||
</li>
|
||||
<li class="listitem">
|
||||
|
||||
The following people contributed an important review of the design, documentation
|
||||
and c ode: Kevin Lynch, Thorsten Ottosen, Paul Bristow, Daryle Walker,
|
||||
Jhon Torjo, Eric Ford, Gennadiy Rozental.
|
||||
|
||||
<li>
|
||||
The following people contributed an important review of the design, documentation
|
||||
and c ode: Kevin Lynch, Thorsten Ottosen, Paul Bristow, Daryle Walker, Jhon
|
||||
Torjo, Eric Ford, Gennadiy Rozental.
|
||||
</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2004 -2007 Fernando Luis Cacciola Carballal<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="u" href="../index.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a>
|
||||
<a accesskey="p" href="../boost_numericconversion/improved_numeric_cast__.html"><img src="../../../../../../doc/html/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../../doc/html/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../../doc/html/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../../../../../doc/html/images/next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+11
-38
@@ -15,7 +15,7 @@
|
||||
The lack of preservation of range makes conversions between numeric types
|
||||
error prone. This is true for both implicit conversions and explicit
|
||||
conversions (through `static_cast`).
|
||||
[link boost_numericconversion.improved_numeric_cast__.numeric_cast `numeric_cast`]
|
||||
[link numeric_conversion_numeric_cast `numeric_cast`]
|
||||
detects loss of range when a numeric type is converted, and throws an
|
||||
exception if the range cannot be preserved.
|
||||
|
||||
@@ -34,7 +34,7 @@ behavior for overflow is undefined for all conversions (except the
|
||||
aforementioned unsigned to unsigned) makes any code that may produce
|
||||
positive or negative overflows exposed to portability issues.
|
||||
|
||||
By default `numeric_cast` adheres to the rules for implicit conversions mandated by
|
||||
`numeric_cast` adheres to the rules for implicit conversions mandated by
|
||||
the C++ Standard, such as truncating floating point types when converting
|
||||
to integral types. The implementation must guarantee that for a conversion
|
||||
to a type that can hold all possible values of the source type, there will
|
||||
@@ -42,29 +42,20 @@ be no runtime overhead.
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_numeric_cast]
|
||||
|
||||
[section numeric_cast]
|
||||
|
||||
template <typename Target, typename Source> inline
|
||||
Target numeric_cast( Source arg )
|
||||
|
||||
template<typename Target, typename Source> inline
|
||||
typename boost::numeric::converter<Target,Source>::result_type
|
||||
numeric_cast ( Source arg )
|
||||
{
|
||||
typedef conversion_traits<Target, Source> conv_traits;
|
||||
typedef numeric_cast_traits<Target, Source> cast_traits;
|
||||
typedef converter
|
||||
<
|
||||
Target,
|
||||
Source,
|
||||
conv_traits,
|
||||
typename cast_traits::overflow_policy,
|
||||
typename cast_traits::rounding_policy,
|
||||
raw_converter<conv_traits>,
|
||||
typename cast_traits::range_checking_policy
|
||||
> converter;
|
||||
return converter::convert(arg);
|
||||
return boost::numeric::converter<Target,Source>::convert(arg);
|
||||
}
|
||||
|
||||
`numeric_cast` returns the result of converting a value of type Source
|
||||
to a value of type Target. If out-of-range is detected, an overflow policy
|
||||
is executed whose default behavior is to throw an an exception (see
|
||||
to a value of type Target. If out-of-range is detected, an exception is
|
||||
thrown (see
|
||||
[link numeric_conversion_bad_numeric_cast bad_numeric_cast],
|
||||
[link numeric_conversion_negative_overflow negative_overflow] and
|
||||
[link numeric_conversion_possitive_overflow positive_overflow]
|
||||
@@ -72,24 +63,6 @@ is executed whose default behavior is to throw an an exception (see
|
||||
|
||||
[endsect]
|
||||
|
||||
[section numeric_cast_traits]
|
||||
|
||||
template <typename Target, typename Source, typename EnableIf = void>
|
||||
struct numeric_cast_traits
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<Source> rounding_policy;
|
||||
};
|
||||
|
||||
The behavior of `numeric_cast` may be tailored for custom numeric types through
|
||||
the specialization of `numeric_cast_traits`. (see
|
||||
[link boost_numericconversion.type_requirements_and_user_defined_types_support User Defined Types]
|
||||
for details.
|
||||
)
|
||||
|
||||
[endsect]
|
||||
|
||||
[section Examples]
|
||||
|
||||
The following example performs some typical conversions between numeric types:
|
||||
|
||||
+9
-343
@@ -8,6 +8,8 @@
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
]
|
||||
|
||||
[#numeric_conversion_requirements]
|
||||
|
||||
[section Type Requirements and User-defined-types support]
|
||||
|
||||
[section Type Requirements]
|
||||
@@ -47,7 +49,7 @@ is positive or not, and for this it evaluates the expression
|
||||
[heading Conversion Traits]
|
||||
|
||||
If a User Defined Type is involved in a conversion, it is ['assumed] that
|
||||
the UDT has [link boost_numericconversion.definitions.range_and_precision wider range]
|
||||
the UDT has [link numeric_conversion_definitions_range wider range]
|
||||
than any built-in type, and consequently the values
|
||||
of some `converter_traits<>` members are hardwired regardless of the reality.
|
||||
The following table summarizes this:
|
||||
@@ -78,10 +80,12 @@ checking logic when UDTs are involved in a conversion. Therefore, if either
|
||||
Target or Source are not built-in types, the bundled range checking of the
|
||||
`converter<>` function object is automatically disabled. However, it is possible
|
||||
to supply a user-defined range-checker. See
|
||||
[link boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies Special Policies]
|
||||
[link numeric_conversion_requirements_hooks Special Policies]
|
||||
|
||||
[endsect]
|
||||
|
||||
[#numeric_conversion_requirements_hooks]
|
||||
|
||||
[section Special Policies]
|
||||
|
||||
There are two components of the `converter<>` class that might require special
|
||||
@@ -94,355 +98,17 @@ of the types.
|
||||
|
||||
However, this internal logic is disabled when either type is User Defined.
|
||||
In this case, the user can specify an ['external] range checking policy which will be
|
||||
used in place of the internal code. See
|
||||
[link boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast numeric_cast_traits]
|
||||
for details on using UDTs with `numeric_cast`.
|
||||
used in place of the internal code. See
|
||||
[link numeric_conversion_policy_user_range_checker UserRangeChecker] policy for details.
|
||||
|
||||
The converter class performs the actual conversion using a Raw Converter policy.
|
||||
The default raw converter simply performs a `static_cast<Target>(source)`.
|
||||
|
||||
However, if the a UDT is involved, the `static_cast` might not work. In this case,
|
||||
the user can implement and pass a different raw converter policy.
|
||||
See [link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy for details.
|
||||
See [link numeric_conversion_policy_raw_converter RawConverter] policy for details
|
||||
|
||||
[endsect]
|
||||
|
||||
[section UDTs with numeric_cast]
|
||||
|
||||
In order to employ UDTs with `numeric_cast`, the user should define
|
||||
a `numeric_cast_traits` specialization on the UDT for each conversion.
|
||||
Here is an example of specializations for converting between the UDT
|
||||
and any other type:
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
template <typename Source>
|
||||
struct numeric_cast_traits<UDT, Source>
|
||||
{
|
||||
typedef conversion_traits<UDT, Source> conv_traits;
|
||||
|
||||
//! The following are required:
|
||||
typedef YourOverflowHandlerPolicy overflow_policy;
|
||||
typedef YourRangeCheckerPolicy<conv_traits> range_checking_policy;
|
||||
typedef YourFloat2IntRounderPolicy<Source> rounding_policy;
|
||||
};
|
||||
template <typename Target>
|
||||
struct numeric_cast_traits<Target, UDT>
|
||||
{
|
||||
typedef conversion_traits<Target, UDT> conv_traits;
|
||||
|
||||
//! The following are required:
|
||||
typedef YourOverflowHandlerPolicy overflow_policy;
|
||||
typedef YourRangeCheckerPolicy<conv_traits> range_checking_policy;
|
||||
typedef YourFloat2IntRounderPolicy<UDT> rounding_policy;
|
||||
};
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
These specializations are already defined with default values for the built-in
|
||||
numeric types. It is possible to disable the generation of specializations for
|
||||
built-in types by defining `BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS`.
|
||||
For details on defining custom policies see [link boost_numericconversion.numeric_converter_policy_classes Converter Policies].
|
||||
|
||||
Here is a full example of how to define a custom UDT for use with `numeric_cast`:
|
||||
|
||||
//! Define a simple custom number
|
||||
struct Double
|
||||
: boost::ordered_field_operators
|
||||
<
|
||||
Double
|
||||
, boost::ordered_field_operators2< Double, long double
|
||||
, boost::ordered_field_operators2< Double, double
|
||||
, boost::ordered_field_operators2< Double, float
|
||||
, boost::ordered_field_operators2< Double, int
|
||||
, boost::ordered_field_operators2< Double, unsigned int
|
||||
, boost::ordered_field_operators2< Double, long
|
||||
, boost::ordered_field_operators2< Double, unsigned long
|
||||
, boost::ordered_field_operators2< Double, long long
|
||||
, boost::ordered_field_operators2< Double, unsigned long long
|
||||
, boost::ordered_field_operators2< Double, char
|
||||
, boost::ordered_field_operators2< Double, unsigned char
|
||||
, boost::ordered_field_operators2< Double, short
|
||||
, boost::ordered_field_operators2< Double, unsigned short
|
||||
> > > > > > > > > > > > > >
|
||||
{
|
||||
Double()
|
||||
: v(0)
|
||||
{}
|
||||
|
||||
template <typename T>
|
||||
explicit Double( T v )
|
||||
: v(static_cast<double>(v))
|
||||
{}
|
||||
|
||||
template <typename T>
|
||||
Double& operator= ( T t )
|
||||
{
|
||||
v = static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool operator < ( const Double& rhs ) const
|
||||
{
|
||||
return v < rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator < ( T rhs ) const
|
||||
{
|
||||
return v < static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
bool operator > ( const Double& rhs ) const
|
||||
{
|
||||
return v > rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator > ( T rhs ) const
|
||||
{
|
||||
return v > static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
bool operator ==( const Double& rhs ) const
|
||||
{
|
||||
return v == rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator == ( T rhs ) const
|
||||
{
|
||||
return v == static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
bool operator !() const
|
||||
{
|
||||
return v == 0;
|
||||
}
|
||||
|
||||
Double operator -() const
|
||||
{
|
||||
return Double(-v);
|
||||
}
|
||||
|
||||
Double& operator +=( const Double& t )
|
||||
{
|
||||
v += t.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator +=( T t )
|
||||
{
|
||||
v += static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator -=( const Double& t )
|
||||
{
|
||||
v -= t.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator -=( T t )
|
||||
{
|
||||
v -= static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator *= ( const Double& factor )
|
||||
{
|
||||
v *= factor.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator *=( T t )
|
||||
{
|
||||
v *= static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator /= (const Double& divisor)
|
||||
{
|
||||
v /= divisor.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator /=( T t )
|
||||
{
|
||||
v /= static_cast<double>(t);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
double v;
|
||||
};
|
||||
|
||||
//! Define numeric_limits for the custom type.
|
||||
namespace std
|
||||
{
|
||||
template<>
|
||||
class numeric_limits<Double> : public numeric_limits<double>
|
||||
{
|
||||
public:
|
||||
|
||||
//! Limit our Double to a range of +/- 100.0
|
||||
static Double (min)()
|
||||
{
|
||||
return Double(1.e-2);
|
||||
}
|
||||
|
||||
static Double (max)()
|
||||
{
|
||||
return Double(1.e2);
|
||||
}
|
||||
|
||||
static Double epsilon()
|
||||
{
|
||||
return Double( std::numeric_limits<double>::epsilon() );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//! Define range checking and overflow policies.
|
||||
namespace custom
|
||||
{
|
||||
//! Define a custom range checker
|
||||
template<typename Traits, typename OverFlowHandler>
|
||||
struct range_checker
|
||||
{
|
||||
typedef typename Traits::argument_type argument_type ;
|
||||
typedef typename Traits::source_type S;
|
||||
typedef typename Traits::target_type T;
|
||||
|
||||
//! Check range of integral types.
|
||||
static boost::numeric::range_check_result out_of_range( argument_type s )
|
||||
{
|
||||
using namespace boost::numeric;
|
||||
if( s > bounds<T>::highest() )
|
||||
return cPosOverflow;
|
||||
else if( s < bounds<T>::lowest() )
|
||||
return cNegOverflow;
|
||||
else
|
||||
return cInRange;
|
||||
}
|
||||
|
||||
static void validate_range ( argument_type s )
|
||||
{
|
||||
BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_bounded );
|
||||
OverFlowHandler()( out_of_range(s) );
|
||||
}
|
||||
};
|
||||
|
||||
//! Overflow handler
|
||||
struct positive_overflow{};
|
||||
struct negative_overflow{};
|
||||
|
||||
struct overflow_handler
|
||||
{
|
||||
void operator() ( boost::numeric::range_check_result r )
|
||||
{
|
||||
using namespace boost::numeric;
|
||||
if( r == cNegOverflow )
|
||||
throw negative_overflow() ;
|
||||
else if( r == cPosOverflow )
|
||||
throw positive_overflow() ;
|
||||
}
|
||||
};
|
||||
|
||||
//! Define a rounding policy and specialize on the custom type.
|
||||
template<class S>
|
||||
struct Ceil : boost::numeric::Ceil<S>{};
|
||||
|
||||
template<>
|
||||
struct Ceil<Double>
|
||||
{
|
||||
typedef Double source_type;
|
||||
|
||||
typedef Double const& argument_type;
|
||||
|
||||
static source_type nearbyint ( argument_type s )
|
||||
{
|
||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
|
||||
using std::ceil ;
|
||||
#endif
|
||||
return Double( ceil(s.v) );
|
||||
}
|
||||
|
||||
typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_infinity> round_style;
|
||||
};
|
||||
|
||||
//! Define a rounding policy and specialize on the custom type.
|
||||
template<class S>
|
||||
struct Trunc: boost::numeric::Trunc<S>{};
|
||||
|
||||
template<>
|
||||
struct Trunc<Double>
|
||||
{
|
||||
typedef Double source_type;
|
||||
|
||||
typedef Double const& argument_type;
|
||||
|
||||
static source_type nearbyint ( argument_type s )
|
||||
{
|
||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
|
||||
using std::floor;
|
||||
#endif
|
||||
return Double( floor(s.v) );
|
||||
}
|
||||
|
||||
typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style;
|
||||
};
|
||||
}//namespace custom;
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
//! Define the numeric_cast_traits specializations on the custom type.
|
||||
template <typename S>
|
||||
struct numeric_cast_traits<Double, S>
|
||||
{
|
||||
typedef custom::overflow_handler overflow_policy;
|
||||
typedef custom::range_checker
|
||||
<
|
||||
boost::numeric::conversion_traits<Double, S>
|
||||
, overflow_policy
|
||||
> range_checking_policy;
|
||||
typedef boost::numeric::Trunc<S> rounding_policy;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct numeric_cast_traits<T, Double>
|
||||
{
|
||||
typedef custom::overflow_handler overflow_policy;
|
||||
typedef custom::range_checker
|
||||
<
|
||||
boost::numeric::conversion_traits<T, Double>
|
||||
, overflow_policy
|
||||
> range_checking_policy;
|
||||
typedef custom::Trunc<Double> rounding_policy;
|
||||
};
|
||||
|
||||
//! Define the conversion from the custom type to built-in types and vice-versa.
|
||||
template<typename T>
|
||||
struct raw_converter< conversion_traits< T, Double > >
|
||||
{
|
||||
static T low_level_convert ( const Double& n )
|
||||
{
|
||||
return static_cast<T>( n.v );
|
||||
}
|
||||
};
|
||||
|
||||
template<typename S>
|
||||
struct raw_converter< conversion_traits< Double, S > >
|
||||
{
|
||||
static Double low_level_convert ( const S& n )
|
||||
{
|
||||
return Double(n);
|
||||
}
|
||||
};
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
// 30 Oct 2001 Some fixes suggested by Daryle Walker (Fernando Cacciola)
|
||||
// 25 Oct 2001 Initial boostification (Fernando Cacciola)
|
||||
// 23 Jan 2004 Inital add to cvs (post review)s
|
||||
// 22 Jun 2011 Added support for specializing cast policies via numeric_cast_traits (Brandon Kohn).
|
||||
//
|
||||
#ifndef BOOST_NUMERIC_CONVERSION_CAST_25OCT2001_HPP
|
||||
#define BOOST_NUMERIC_CONVERSION_CAST_25OCT2001_HPP
|
||||
@@ -31,31 +30,22 @@
|
||||
|
||||
#include <boost/type.hpp>
|
||||
#include <boost/numeric/conversion/converter.hpp>
|
||||
#include <boost/numeric/conversion/numeric_cast_traits.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
template <typename Target, typename Source>
|
||||
inline Target numeric_cast( Source arg )
|
||||
{
|
||||
typedef numeric::conversion_traits<Target, Source> conv_traits;
|
||||
typedef numeric::numeric_cast_traits<Target, Source> cast_traits;
|
||||
typedef boost::numeric::converter
|
||||
<
|
||||
Target,
|
||||
Source,
|
||||
conv_traits,
|
||||
typename cast_traits::overflow_policy,
|
||||
typename cast_traits::rounding_policy,
|
||||
boost::numeric::raw_converter< conv_traits >,
|
||||
typename cast_traits::range_checking_policy
|
||||
> converter;
|
||||
return converter::convert(arg);
|
||||
}
|
||||
|
||||
using numeric::bad_numeric_cast;
|
||||
template<typename Target, typename Source>
|
||||
inline
|
||||
Target numeric_cast ( Source arg )
|
||||
{
|
||||
typedef boost::numeric::converter<Target,Source> Converter ;
|
||||
return Converter::convert(arg);
|
||||
}
|
||||
|
||||
using numeric::bad_numeric_cast;
|
||||
|
||||
} // namespace boost
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -12,8 +12,7 @@
|
||||
|
||||
#include <typeinfo> // for std::bad_cast
|
||||
|
||||
#include <boost/config/no_tr1/cmath.hpp> // for std::floor and std::ceil
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <cmath> // for std::floor and std::ceil
|
||||
|
||||
#include <functional>
|
||||
|
||||
@@ -159,17 +158,10 @@ struct def_overflow_handler
|
||||
{
|
||||
void operator() ( range_check_result r ) // throw(negative_overflow,positive_overflow)
|
||||
{
|
||||
#ifndef BOOST_NO_EXCEPTIONS
|
||||
if ( r == cNegOverflow )
|
||||
throw negative_overflow() ;
|
||||
else if ( r == cPosOverflow )
|
||||
throw positive_overflow() ;
|
||||
#else
|
||||
if ( r == cNegOverflow )
|
||||
::boost::throw_exception(negative_overflow()) ;
|
||||
else if ( r == cPosOverflow )
|
||||
::boost::throw_exception(positive_overflow()) ;
|
||||
#endif
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
//
|
||||
//! Copyright (c) 2011-2012
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
|
||||
#if !defined(BOOST_NUMERIC_CONVERSION_DONT_USE_PREPROCESSED_FILES)
|
||||
|
||||
#include <boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_LONG_LONG)
|
||||
#include <boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp>
|
||||
#endif
|
||||
|
||||
#else
|
||||
#if !BOOST_PP_IS_ITERATING
|
||||
|
||||
#include <boost/preprocessor/seq/elem.hpp>
|
||||
#include <boost/preprocessor/seq/size.hpp>
|
||||
#include <boost/preprocessor/iteration/iterate.hpp>
|
||||
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 2, line: 0, output: "preprocessed/numeric_cast_traits_common.hpp")
|
||||
#endif
|
||||
//
|
||||
//! Copyright (c) 2011-2012
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 1)
|
||||
#endif
|
||||
|
||||
//! These are the assumed common built in fundamental types (not typedefs/macros.)
|
||||
#define BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES() \
|
||||
(char) \
|
||||
(signed char) \
|
||||
(unsigned char) \
|
||||
(short) \
|
||||
(unsigned short) \
|
||||
(int) \
|
||||
(unsigned int) \
|
||||
(long) \
|
||||
(unsigned long) \
|
||||
(float) \
|
||||
(double) \
|
||||
(long double) \
|
||||
/***/
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_SEQ_A() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES()
|
||||
#define BOOST_NUMERIC_CONVERSION_SEQ_B() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES()
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_A())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>))
|
||||
#include BOOST_PP_ITERATE()
|
||||
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(output: null)
|
||||
#endif
|
||||
|
||||
#if ( defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) ) || !defined(BOOST_NO_LONG_LONG)
|
||||
|
||||
#undef BOOST_NUMERIC_CONVERSION_SEQ_A
|
||||
#undef BOOST_NUMERIC_CONVERSION_SEQ_B
|
||||
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 2, line: 0, output: "preprocessed/numeric_cast_traits_long_long.hpp")
|
||||
#endif
|
||||
|
||||
//
|
||||
//! Copyright (c) 2011-2012
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 1)
|
||||
#endif
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_SEQ_A() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES()(boost::long_long_type)(boost::ulong_long_type)
|
||||
#define BOOST_NUMERIC_CONVERSION_SEQ_B() (boost::long_long_type)(boost::ulong_long_type)
|
||||
|
||||
#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_A())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>))
|
||||
#include BOOST_PP_ITERATE()
|
||||
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
#if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(output: null)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#undef BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES
|
||||
#undef BOOST_NUMERIC_CONVERSION_SEQ_A
|
||||
#undef BOOST_NUMERIC_CONVERSION_SEQ_B
|
||||
|
||||
#elif BOOST_PP_ITERATION_DEPTH() == 1
|
||||
|
||||
#define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_B())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>))
|
||||
#include BOOST_PP_ITERATE()
|
||||
|
||||
#elif BOOST_PP_ITERATION_DEPTH() == 2
|
||||
|
||||
//! Generate default traits for the specified source and target.
|
||||
#define BOOST_NUMERIC_CONVERSION_A BOOST_PP_FRAME_ITERATION(1)
|
||||
#define BOOST_NUMERIC_CONVERSION_B BOOST_PP_FRAME_ITERATION(2)
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_A, BOOST_NUMERIC_CONVERSION_SEQ_A())
|
||||
, BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_B, BOOST_NUMERIC_CONVERSION_SEQ_B())
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_B, BOOST_NUMERIC_CONVERSION_SEQ_B())> rounding_policy;
|
||||
};
|
||||
|
||||
#undef BOOST_NUMERIC_CONVERSION_A
|
||||
#undef BOOST_NUMERIC_CONVERSION_B
|
||||
|
||||
#endif//! Depth 2.
|
||||
#endif// BOOST_NUMERIC_CONVERSION_DONT_USE_PREPROCESSED_FILES
|
||||
File diff suppressed because it is too large
Load Diff
-347
@@ -1,347 +0,0 @@
|
||||
//
|
||||
//! Copyright (c) 2011-2012
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
char
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
char
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
signed char
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
signed char
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned char
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned char
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
short
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
short
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned short
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned short
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
int
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
int
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned int
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned int
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
long
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
long
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned long
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
unsigned long
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
float
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
float
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
double
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
double
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
long double
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
long double
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
boost::long_long_type
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
boost::long_long_type
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
boost::ulong_long_type
|
||||
, boost::long_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::long_long_type> rounding_policy;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct numeric_cast_traits
|
||||
<
|
||||
boost::ulong_long_type
|
||||
, boost::ulong_long_type
|
||||
>
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<boost::ulong_long_type> rounding_policy;
|
||||
};
|
||||
}}
|
||||
@@ -1,31 +0,0 @@
|
||||
//
|
||||
//! Copyright (c) 2011
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
#ifndef BOOST_NUMERIC_CAST_TRAITS_HPP
|
||||
#define BOOST_NUMERIC_CAST_TRAITS_HPP
|
||||
|
||||
#include <boost/numeric/conversion/converter_policies.hpp>
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
template <typename Target, typename Source, typename EnableIf = void>
|
||||
struct numeric_cast_traits
|
||||
{
|
||||
typedef def_overflow_handler overflow_policy;
|
||||
typedef UseInternalRangeChecker range_checking_policy;
|
||||
typedef Trunc<Source> rounding_policy;
|
||||
};
|
||||
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
#if !defined( BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS )
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/numeric/conversion/detail/numeric_cast_traits.hpp>
|
||||
#endif//!defined BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS
|
||||
|
||||
#endif//BOOST_NUMERIC_CAST_TRAITS_HPP
|
||||
@@ -5,16 +5,6 @@
|
||||
# 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)
|
||||
#
|
||||
# import testing ;
|
||||
|
||||
project numeric_conversion_unit_tests
|
||||
:
|
||||
requirements
|
||||
<include>.
|
||||
<toolset>gcc:<cxxflags>"-ftemplate-depth-300 -g0"
|
||||
<toolset>darwin:<cxxflags>"-ftemplate-depth-300 -g0"
|
||||
;
|
||||
|
||||
test-suite numeric/conversion :
|
||||
[ run bounds_test.cpp ]
|
||||
@@ -23,10 +13,5 @@ project numeric_conversion_unit_tests
|
||||
[ run udt_support_test.cpp ]
|
||||
[ run numeric_cast_test.cpp ]
|
||||
[ run udt_example_0.cpp ]
|
||||
[ run numeric_cast_traits_test.cpp ]
|
||||
;
|
||||
|
||||
test-suite "compile_fail_test" :
|
||||
[ compile-fail compile_fail/built_in_numeric_cast_traits.cpp ]
|
||||
;
|
||||
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
//
|
||||
//! Copyright (c) 2011
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/numeric/conversion/cast.hpp>
|
||||
#include <boost/preprocessor/control/iif.hpp>
|
||||
#include <boost/preprocessor/comparison/less.hpp>
|
||||
#include <boost/preprocessor/comparison/not_equal.hpp>
|
||||
#include <boost/preprocessor/repetition/for.hpp>
|
||||
#include <boost/preprocessor/tuple/elem.hpp>
|
||||
#include <boost/preprocessor/seq/elem.hpp>
|
||||
#include <boost/preprocessor/seq/size.hpp>
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
//! Generate default traits for the specified source and target.
|
||||
#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS(r, state) \
|
||||
template <> \
|
||||
struct numeric_cast_traits< \
|
||||
BOOST_PP_SEQ_ELEM( BOOST_PP_TUPLE_ELEM(4,0,state) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,3,state) ) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,2,state)> \
|
||||
{ \
|
||||
typedef def_overflow_handler overflow_policy; \
|
||||
typedef UseInternalRangeChecker range_checking_policy; \
|
||||
typedef Trunc<BOOST_PP_TUPLE_ELEM(4,2,state)> rounding_policy; \
|
||||
}; \
|
||||
/***/
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL(r, state) \
|
||||
BOOST_PP_LESS \
|
||||
( \
|
||||
BOOST_PP_TUPLE_ELEM(4,0,state) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,1,state) \
|
||||
) \
|
||||
/***/
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_INC_OP(r, state) \
|
||||
( \
|
||||
BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4,0,state)) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,1,state) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,2,state) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,3,state) \
|
||||
) \
|
||||
/***/
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP(r, state) \
|
||||
BOOST_PP_FOR \
|
||||
( \
|
||||
( \
|
||||
0 \
|
||||
, BOOST_PP_TUPLE_ELEM(4,1,state) \
|
||||
, BOOST_PP_SEQ_ELEM(BOOST_PP_TUPLE_ELEM(4,0,state),BOOST_PP_TUPLE_ELEM(4,2,state)) \
|
||||
, BOOST_PP_TUPLE_ELEM(4,2,state) \
|
||||
) \
|
||||
, BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \
|
||||
, BOOST_NUMERIC_CONVERSION_INC_OP \
|
||||
, BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS \
|
||||
) \
|
||||
/***/
|
||||
|
||||
#define BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS(types) \
|
||||
BOOST_PP_FOR \
|
||||
( \
|
||||
(0,BOOST_PP_SEQ_SIZE(types),types,_) \
|
||||
, BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \
|
||||
, BOOST_NUMERIC_CONVERSION_INC_OP \
|
||||
, BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP \
|
||||
) \
|
||||
/***/
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
#if !defined( BOOST_NO_INT64_T )
|
||||
//! Generate the specializations for the built-in types.
|
||||
BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
|
||||
(
|
||||
(char)
|
||||
(boost::int8_t)
|
||||
(boost::uint8_t)
|
||||
(boost::int16_t)
|
||||
(boost::uint16_t)
|
||||
(boost::int32_t)
|
||||
(boost::uint32_t)
|
||||
(boost::int64_t)
|
||||
(boost::uint64_t)
|
||||
(float)
|
||||
(double)
|
||||
(long double)
|
||||
)
|
||||
#else
|
||||
BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
|
||||
(
|
||||
(char)
|
||||
(boost::int8_t)
|
||||
(boost::uint8_t)
|
||||
(boost::int16_t)
|
||||
(boost::uint16_t)
|
||||
(boost::int32_t)
|
||||
(boost::uint32_t)
|
||||
(float)
|
||||
(double)
|
||||
(long double)
|
||||
)
|
||||
#endif
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
int test_main( int argc, char * argv[] )
|
||||
{
|
||||
//! This test should not compile.
|
||||
return 1;
|
||||
}
|
||||
|
||||
#undef BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
|
||||
#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP
|
||||
#undef BOOST_NUMERIC_CONVERSION_INC_OP
|
||||
#undef BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL
|
||||
#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS
|
||||
@@ -1,380 +0,0 @@
|
||||
//
|
||||
//! Copyright (c) 2011
|
||||
//! Brandon Kohn
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
|
||||
#include <boost/operators.hpp>
|
||||
#include <boost/numeric/conversion/cast.hpp>
|
||||
#include <boost/mpl/for_each.hpp>
|
||||
#include <boost/mpl/vector.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/test/minimal.hpp>
|
||||
|
||||
//! Define a simple custom number
|
||||
struct Double
|
||||
{
|
||||
Double()
|
||||
: v(0)
|
||||
{}
|
||||
|
||||
template <typename T>
|
||||
explicit Double( T v )
|
||||
: v(static_cast<double>(v))
|
||||
{}
|
||||
|
||||
template <typename T>
|
||||
Double& operator= ( T t )
|
||||
{
|
||||
v = static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool operator < ( const Double& rhs ) const
|
||||
{
|
||||
return v < rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator < ( T rhs ) const
|
||||
{
|
||||
return v < static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
template <typename LHS>
|
||||
friend bool operator < ( const LHS& lhs, const Double& rhs )
|
||||
{
|
||||
return lhs < rhs.v;
|
||||
}
|
||||
|
||||
bool operator > ( const Double& rhs ) const
|
||||
{
|
||||
return v > rhs.v;
|
||||
}
|
||||
|
||||
template <typename LHS>
|
||||
friend bool operator > ( const LHS& lhs, const Double& rhs )
|
||||
{
|
||||
return lhs > rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator > ( T rhs ) const
|
||||
{
|
||||
return v > static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
bool operator == ( const Double& rhs ) const
|
||||
{
|
||||
return v == rhs.v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool operator == ( T rhs ) const
|
||||
{
|
||||
return v == static_cast<double>(rhs);
|
||||
}
|
||||
|
||||
template <typename LHS>
|
||||
friend bool operator == ( const LHS& lhs, const Double& rhs )
|
||||
{
|
||||
return lhs == rhs.v;
|
||||
}
|
||||
|
||||
bool operator !() const
|
||||
{
|
||||
return v == 0;
|
||||
}
|
||||
|
||||
Double operator -() const
|
||||
{
|
||||
return Double(-v);
|
||||
}
|
||||
|
||||
Double& operator +=( const Double& t )
|
||||
{
|
||||
v += t.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator +=( T t )
|
||||
{
|
||||
v += static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator -=( const Double& t )
|
||||
{
|
||||
v -= t.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator -=( T t )
|
||||
{
|
||||
v -= static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator *= ( const Double& factor )
|
||||
{
|
||||
v *= factor.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator *=( T t )
|
||||
{
|
||||
v *= static_cast<double>(t);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Double& operator /= (const Double& divisor)
|
||||
{
|
||||
v /= divisor.v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Double& operator /=( T t )
|
||||
{
|
||||
v /= static_cast<double>(t);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
double v;
|
||||
};
|
||||
|
||||
//! Define numeric_limits for the custom type.
|
||||
namespace std
|
||||
{
|
||||
template<>
|
||||
class numeric_limits< Double > : public numeric_limits<double>
|
||||
{
|
||||
public:
|
||||
|
||||
//! Limit our Double to a range of +/- 100.0
|
||||
static Double (min)()
|
||||
{
|
||||
return Double(1.e-2);
|
||||
}
|
||||
|
||||
static Double (max)()
|
||||
{
|
||||
return Double(1.e2);
|
||||
}
|
||||
|
||||
static Double epsilon()
|
||||
{
|
||||
return Double( std::numeric_limits<double>::epsilon() );
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//! Define range checking and overflow policies.
|
||||
namespace custom
|
||||
{
|
||||
//! Define a custom range checker
|
||||
template<typename Traits, typename OverFlowHandler>
|
||||
struct range_checker
|
||||
{
|
||||
typedef typename Traits::argument_type argument_type ;
|
||||
typedef typename Traits::source_type S;
|
||||
typedef typename Traits::target_type T;
|
||||
|
||||
//! Check range of integral types.
|
||||
static boost::numeric::range_check_result out_of_range( argument_type s )
|
||||
{
|
||||
using namespace boost::numeric;
|
||||
if( s > bounds<T>::highest() )
|
||||
return cPosOverflow;
|
||||
else if( s < bounds<T>::lowest() )
|
||||
return cNegOverflow;
|
||||
else
|
||||
return cInRange;
|
||||
}
|
||||
|
||||
static void validate_range ( argument_type s )
|
||||
{
|
||||
BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_bounded );
|
||||
OverFlowHandler()( out_of_range(s) );
|
||||
}
|
||||
};
|
||||
|
||||
//! Overflow handler
|
||||
struct positive_overflow{};
|
||||
struct negative_overflow{};
|
||||
|
||||
struct overflow_handler
|
||||
{
|
||||
void operator() ( boost::numeric::range_check_result r )
|
||||
{
|
||||
using namespace boost::numeric;
|
||||
if( r == cNegOverflow )
|
||||
throw negative_overflow() ;
|
||||
else if( r == cPosOverflow )
|
||||
throw positive_overflow() ;
|
||||
}
|
||||
};
|
||||
|
||||
//! Define a rounding policy and specialize on the custom type.
|
||||
template<class S>
|
||||
struct Ceil : boost::numeric::Ceil<S>{};
|
||||
|
||||
template<>
|
||||
struct Ceil<Double>
|
||||
{
|
||||
typedef Double source_type;
|
||||
|
||||
typedef Double const& argument_type;
|
||||
|
||||
static source_type nearbyint ( argument_type s )
|
||||
{
|
||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
|
||||
using std::ceil ;
|
||||
#endif
|
||||
return Double( ceil(s.v) );
|
||||
}
|
||||
|
||||
typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_infinity> round_style;
|
||||
};
|
||||
|
||||
//! Define a rounding policy and specialize on the custom type.
|
||||
template<class S>
|
||||
struct Trunc: boost::numeric::Trunc<S>{};
|
||||
|
||||
template<>
|
||||
struct Trunc<Double>
|
||||
{
|
||||
typedef Double source_type;
|
||||
|
||||
typedef Double const& argument_type;
|
||||
|
||||
static source_type nearbyint ( argument_type s )
|
||||
{
|
||||
#if !defined(BOOST_NO_STDC_NAMESPACE)
|
||||
using std::floor;
|
||||
#endif
|
||||
return Double( floor(s.v) );
|
||||
}
|
||||
|
||||
typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style;
|
||||
};
|
||||
}//namespace custom;
|
||||
|
||||
namespace boost { namespace numeric {
|
||||
|
||||
//! Define the numeric_cast_traits specializations on the custom type.
|
||||
template <typename S>
|
||||
struct numeric_cast_traits<Double, S>
|
||||
{
|
||||
typedef custom::overflow_handler overflow_policy;
|
||||
typedef custom::range_checker
|
||||
<
|
||||
boost::numeric::conversion_traits<Double, S>
|
||||
, overflow_policy
|
||||
> range_checking_policy;
|
||||
typedef boost::numeric::Trunc<S> rounding_policy;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct numeric_cast_traits<T, Double>
|
||||
{
|
||||
typedef custom::overflow_handler overflow_policy;
|
||||
typedef custom::range_checker
|
||||
<
|
||||
boost::numeric::conversion_traits<T, Double>
|
||||
, overflow_policy
|
||||
> range_checking_policy;
|
||||
typedef custom::Trunc<Double> rounding_policy;
|
||||
};
|
||||
|
||||
//! Define the conversion from the custom type to built-in types and vice-versa.
|
||||
template<typename T>
|
||||
struct raw_converter< conversion_traits< T, Double > >
|
||||
{
|
||||
static T low_level_convert ( const Double& n )
|
||||
{
|
||||
return static_cast<T>( n.v );
|
||||
}
|
||||
};
|
||||
|
||||
template<typename S>
|
||||
struct raw_converter< conversion_traits< Double, S > >
|
||||
{
|
||||
static Double low_level_convert ( const S& n )
|
||||
{
|
||||
return Double(n);
|
||||
}
|
||||
};
|
||||
}}//namespace boost::numeric;
|
||||
|
||||
#define BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW( CastCode ) \
|
||||
try { CastCode; BOOST_CHECK( false ); } \
|
||||
catch( custom::positive_overflow& ){} \
|
||||
catch(...){ BOOST_CHECK( false ); } \
|
||||
/***/
|
||||
|
||||
#define BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW( CastCode ) \
|
||||
try { CastCode; BOOST_CHECK( false ); } \
|
||||
catch( custom::negative_overflow& ){} \
|
||||
catch(...){ BOOST_CHECK( false ); } \
|
||||
/***/
|
||||
|
||||
struct test_cast_traits
|
||||
{
|
||||
template <typename T>
|
||||
void operator()(T) const
|
||||
{
|
||||
Double d = boost::numeric_cast<Double>( static_cast<T>(50) );
|
||||
BOOST_CHECK( d.v == 50. );
|
||||
T v = boost::numeric_cast<T>( d );
|
||||
BOOST_CHECK( v == 50 );
|
||||
}
|
||||
};
|
||||
|
||||
void test_numeric_cast_traits()
|
||||
{
|
||||
typedef boost::mpl::vector
|
||||
<
|
||||
boost::int8_t
|
||||
, boost::uint8_t
|
||||
, boost::int16_t
|
||||
, boost::uint16_t
|
||||
, boost::int32_t
|
||||
, boost::uint32_t
|
||||
#if !defined( BOOST_NO_INT64_T )
|
||||
, boost::int64_t
|
||||
, boost::uint64_t
|
||||
#endif
|
||||
, float
|
||||
, double
|
||||
, long double
|
||||
> types;
|
||||
boost::mpl::for_each<types>( test_cast_traits() );
|
||||
|
||||
//! Check overflow handler.
|
||||
Double d( 56.0 );
|
||||
BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW( d = boost::numeric_cast<Double>( 101 ) );
|
||||
BOOST_CHECK( d.v == 56. );
|
||||
BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW( d = boost::numeric_cast<Double>( -101 ) );
|
||||
BOOST_CHECK( d.v == 56.);
|
||||
|
||||
//! Check custom round policy.
|
||||
d = 5.9;
|
||||
int five = boost::numeric_cast<int>( d );
|
||||
BOOST_CHECK( five == 5 );
|
||||
}
|
||||
|
||||
int test_main( int argc, char * argv[] )
|
||||
{
|
||||
test_numeric_cast_traits();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#undef BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW
|
||||
#undef BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW
|
||||
Reference in New Issue
Block a user