3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Type Requirements and User-defined-types support
</title>
5 <link rel=
"stylesheet" href=
"../boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.78.1">
7 <link rel=
"home" href=
"../index.html" title=
"Chapter 1. Boost.NumericConversion">
8 <link rel=
"up" href=
"../index.html" title=
"Chapter 1. Boost.NumericConversion">
9 <link rel=
"prev" href=
"converter___function_object.html" title=
"converter<> function object">
10 <link rel=
"next" href=
"bounds___traits_class.html" title=
"bounds<> traits class">
12 <body bgcolor=
"white" text=
"black" link=
"#0000FF" vlink=
"#840084" alink=
"#0000FF">
13 <table cellpadding=
"2" width=
"100%"><tr>
14 <td valign=
"top"><img alt=
"Boost C++ Libraries" width=
"277" height=
"86" src=
"../../../../../../boost.png"></td>
15 <td align=
"center"><a href=
"../../../../../../index.html">Home
</a></td>
16 <td align=
"center"><a href=
"../../../../../../libs/libraries.htm">Libraries
</a></td>
17 <td align=
"center"><a href=
"http://www.boost.org/users/people.html">People
</a></td>
18 <td align=
"center"><a href=
"http://www.boost.org/users/faq.html">FAQ
</a></td>
19 <td align=
"center"><a href=
"../../../../../../more/index.htm">More
</a></td>
22 <div class=
"spirit-nav">
23 <a accesskey=
"p" href=
"converter___function_object.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><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=
"n" href=
"bounds___traits_class.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h2 class=
"title" style=
"clear: both">
27 <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
28 Requirements and User-defined-types support
</a>
29 </h2></div></div></div>
30 <div class=
"toc"><dl class=
"toc">
31 <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
32 Requirements
</a></span></dt>
33 <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
34 special semantics
</a></span></dt>
35 <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
36 Policies
</a></span></dt>
37 <dt><span class=
"section"><a href=
"type_requirements_and_user_defined_types_support.html#boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast">UDTs
38 with numeric_cast
</a></span></dt>
41 <div class=
"titlepage"><div><div><h3 class=
"title">
42 <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
44 </h3></div></div></div>
46 Both arithmetic (built-in) and user-defined numeric types require proper
47 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>
48 (that is, with (in-class) integral constants).
51 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
52 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
53 integer or floating point; and whether it is signed/unsigned.
56 The default
<code class=
"computeroutput"><span class=
"identifier">Float2IntRounder
</span></code>
57 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
58 in scope by a using directive:
60 <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>
63 Therefore, for builtin arithmetic types, the std functions will be used.
64 User defined types should provide overloaded versions of these functions
65 in order to use the default rounder policies. If these overloads are defined
66 within a user namespace argument dependent lookup (ADL) should find them,
67 but if your compiler has a weak ADL you might need to put these functions
68 some place else or write your own rounder policy.
71 The default
<code class=
"computeroutput"><span class=
"identifier">Trunc
</span><span class=
"special"><></span></code>
72 rounder policy needs to determine if the source value is positive or not,
73 and for this it evaluates the expression
<code class=
"computeroutput"><span class=
"identifier">s
</span>
74 <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,
75 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).
79 <div class=
"titlepage"><div><div><h3 class=
"title">
80 <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
82 </h3></div></div></div>
84 <a name=
"boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.h0"></a>
85 <span class=
"phrase"><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
89 If a User Defined Type is involved in a conversion, it is
<span class=
"emphasis"><em>assumed
</em></span>
90 that the UDT has
<a class=
"link" href=
"definitions.html#boost_numericconversion.definitions.range_and_precision" title=
"Range and Precision">wider
91 range
</a> than any built-in type, and consequently the values of some
92 <code class=
"computeroutput"><span class=
"identifier">converter_traits
</span><span class=
"special"><></span></code>
93 members are hardwired regardless of the reality. The following table summarizes
96 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: disc; ">
98 <code class=
"computeroutput"><span class=
"identifier">Target
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>UDT
</em></span>
99 and
<code class=
"computeroutput"><span class=
"identifier">Source
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>built-in
</em></span>
100 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: circle; ">
101 <li class=
"listitem">
102 <code class=
"computeroutput"><span class=
"identifier">subranged
</span><span class=
"special">=
</span><span class=
"keyword">false
</span></code>
104 <li class=
"listitem">
105 <code class=
"computeroutput"><span class=
"identifier">supertype
</span><span class=
"special">=
</span><span class=
"identifier">Target
</span></code>
107 <li class=
"listitem">
108 <code class=
"computeroutput"><span class=
"identifier">subtype
</span><span class=
"special">=
</span><span class=
"identifier">Source
</span></code>
112 <li class=
"listitem">
113 <code class=
"computeroutput"><span class=
"identifier">Target
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>built-in
</em></span>
114 and
<code class=
"computeroutput"><span class=
"identifier">Source
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>UDT
</em></span>
115 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: circle; ">
116 <li class=
"listitem">
117 <code class=
"computeroutput"><span class=
"identifier">subranged
</span><span class=
"special">=
</span><span class=
"keyword">true
</span></code>
119 <li class=
"listitem">
120 <code class=
"computeroutput"><span class=
"identifier">supertype
</span><span class=
"special">=
</span><span class=
"identifier">Source
</span></code>
122 <li class=
"listitem">
123 <code class=
"computeroutput"><span class=
"identifier">subtype
</span><span class=
"special">=
</span><span class=
"identifier">Target
</span></code>
127 <li class=
"listitem">
128 <code class=
"computeroutput"><span class=
"identifier">Target
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>UDT
</em></span>
129 and
<code class=
"computeroutput"><span class=
"identifier">Source
</span><span class=
"special">=
</span></code><span class=
"emphasis"><em>UDT
</em></span>
130 <div class=
"itemizedlist"><ul class=
"itemizedlist" style=
"list-style-type: circle; ">
131 <li class=
"listitem">
132 <code class=
"computeroutput"><span class=
"identifier">subranged
</span><span class=
"special">=
</span><span class=
"keyword">false
</span></code>
134 <li class=
"listitem">
135 <code class=
"computeroutput"><span class=
"identifier">supertype
</span><span class=
"special">=
</span><span class=
"identifier">Target
</span></code>
137 <li class=
"listitem">
138 <code class=
"computeroutput"><span class=
"identifier">subtype
</span><span class=
"special">=
</span><span class=
"identifier">Source
</span></code>
144 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
145 a UDT is involved and to infer the validity of the other members as shown
149 <a name=
"boost_numericconversion.type_requirements_and_user_defined_types_support.udt_s_special_semantics.h1"></a>
150 <span class=
"phrase"><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
154 Because User Defined Numeric Types might have peculiar ranges (such as an
155 unbounded range), this library does not attempt to supply a meaningful range
156 checking logic when UDTs are involved in a conversion. Therefore, if either
157 Target or Source are not built-in types, the bundled range checking of the
158 <code class=
"computeroutput"><span class=
"identifier">converter
</span><span class=
"special"><></span></code>
159 function object is automatically disabled. However, it is possible to supply
160 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
164 <div class=
"section">
165 <div class=
"titlepage"><div><div><h3 class=
"title">
166 <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
168 </h3></div></div></div>
170 There are two components of the
<code class=
"computeroutput"><span class=
"identifier">converter
</span><span class=
"special"><></span></code> class that might require special
171 behavior if User Defined Numeric Types are involved: the Range Checking and
175 When both Target and Source are built-in types, the converter class uses
176 an internal range checking logic which is optimized and customized for the
177 combined properties of the types.
180 However, this internal logic is disabled when either type is User Defined.
181 In this case, the user can specify an
<span class=
"emphasis"><em>external
</em></span> range
182 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>
183 for details on using UDTs with
<code class=
"computeroutput"><span class=
"identifier">numeric_cast
</span></code>.
186 The converter class performs the actual conversion using a Raw Converter
187 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>.
190 However, if the a UDT is involved, the
<code class=
"computeroutput"><span class=
"keyword">static_cast
</span></code>
191 might not work. In this case, the user can implement and pass a different
192 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>
196 <div class=
"section">
197 <div class=
"titlepage"><div><div><h3 class=
"title">
198 <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
199 with numeric_cast
</a>
200 </h3></div></div></div>
202 In order to employ UDTs with
<code class=
"computeroutput"><span class=
"identifier">numeric_cast
</span></code>,
203 the user should define a
<code class=
"computeroutput"><span class=
"identifier">numeric_cast_traits
</span></code>
204 specialization on the UDT for each conversion. Here is an example of specializations
205 for converting between the UDT and any other type:
207 <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>
208 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">Source
</span><span class=
"special">></span>
209 <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>
210 <span class=
"special">{
</span>
211 <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>
213 <span class=
"comment">//! The following are required:
</span>
214 <span class=
"keyword">typedef
</span> <span class=
"identifier">YourOverflowHandlerPolicy
</span> <span class=
"identifier">overflow_policy
</span><span class=
"special">;
</span>
215 <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>
216 <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>
217 <span class=
"special">};
</span>
218 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">Target
</span><span class=
"special">></span>
219 <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>
220 <span class=
"special">{
</span>
221 <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>
223 <span class=
"comment">//! The following are required:
</span>
224 <span class=
"keyword">typedef
</span> <span class=
"identifier">YourOverflowHandlerPolicy
</span> <span class=
"identifier">overflow_policy
</span><span class=
"special">;
</span>
225 <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>
226 <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>
227 <span class=
"special">};
</span>
228 <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>
231 These specializations are already defined with default values for the built-in
232 numeric types. It is possible to disable the generation of specializations
233 for built-in types by defining
<code class=
"computeroutput"><span class=
"identifier">BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS
</span></code>.
234 For details on defining custom policies see
<a class=
"link" href=
"numeric_converter_policy_classes.html" title=
"Numeric Converter Policy Classes">Converter
238 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>:
240 <pre class=
"programlisting"><span class=
"comment">//! Define a simple custom number
</span>
241 <span class=
"keyword">struct
</span> <span class=
"identifier">Double
</span>
242 <span class=
"special">:
</span> <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">ordered_field_operators
</span>
243 <span class=
"special"><</span>
244 <span class=
"identifier">Double
</span>
245 <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>
246 <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>
247 <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>
248 <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>
249 <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>
250 <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>
251 <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>
252 <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>
253 <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>
254 <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>
255 <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>
256 <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>
257 <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>
258 <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>
259 <span class=
"special">{
</span>
260 <span class=
"identifier">Double
</span><span class=
"special">()
</span>
261 <span class=
"special">:
</span> <span class=
"identifier">v
</span><span class=
"special">(
</span><span class=
"number">0</span><span class=
"special">)
</span>
262 <span class=
"special">{}
</span>
264 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
265 <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>
266 <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>
267 <span class=
"special">{}
</span>
269 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
270 <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>
271 <span class=
"special">{
</span>
272 <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>
273 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
274 <span class=
"special">}
</span>
276 <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>
277 <span class=
"special">{
</span>
278 <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>
279 <span class=
"special">}
</span>
281 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
282 <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>
283 <span class=
"special">{
</span>
284 <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>
285 <span class=
"special">}
</span>
287 <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>
288 <span class=
"special">{
</span>
289 <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>
290 <span class=
"special">}
</span>
292 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
293 <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>
294 <span class=
"special">{
</span>
295 <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>
296 <span class=
"special">}
</span>
298 <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>
299 <span class=
"special">{
</span>
300 <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>
301 <span class=
"special">}
</span>
303 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
304 <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>
305 <span class=
"special">{
</span>
306 <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>
307 <span class=
"special">}
</span>
309 <span class=
"keyword">bool
</span> <span class=
"keyword">operator
</span> <span class=
"special">!()
</span> <span class=
"keyword">const
</span>
310 <span class=
"special">{
</span>
311 <span class=
"keyword">return
</span> <span class=
"identifier">v
</span> <span class=
"special">==
</span> <span class=
"number">0</span><span class=
"special">;
</span>
312 <span class=
"special">}
</span>
314 <span class=
"identifier">Double
</span> <span class=
"keyword">operator
</span> <span class=
"special">-()
</span> <span class=
"keyword">const
</span>
315 <span class=
"special">{
</span>
316 <span class=
"keyword">return
</span> <span class=
"identifier">Double
</span><span class=
"special">(-
</span><span class=
"identifier">v
</span><span class=
"special">);
</span>
317 <span class=
"special">}
</span>
319 <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>
320 <span class=
"special">{
</span>
321 <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>
322 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
323 <span class=
"special">}
</span>
325 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
326 <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>
327 <span class=
"special">{
</span>
328 <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>
329 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
330 <span class=
"special">}
</span>
332 <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>
333 <span class=
"special">{
</span>
334 <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>
335 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
336 <span class=
"special">}
</span>
338 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
339 <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>
340 <span class=
"special">{
</span>
341 <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>
342 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
343 <span class=
"special">}
</span>
345 <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>
346 <span class=
"special">{
</span>
347 <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>
348 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
349 <span class=
"special">}
</span>
351 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
352 <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>
353 <span class=
"special">{
</span>
354 <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>
355 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
356 <span class=
"special">}
</span>
358 <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>
359 <span class=
"special">{
</span>
360 <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>
361 <span class=
"keyword">return
</span> <span class=
"special">*
</span><span class=
"keyword">this
</span><span class=
"special">;
</span>
362 <span class=
"special">}
</span>
364 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
365 <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>
366 <span class=
"special">{
</span>
367 <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>
368 <span class=
"keyword">return
</span> <span class=
"special">(*
</span><span class=
"keyword">this
</span><span class=
"special">);
</span>
369 <span class=
"special">}
</span>
371 <span class=
"keyword">double
</span> <span class=
"identifier">v
</span><span class=
"special">;
</span>
372 <span class=
"special">};
</span>
374 <span class=
"comment">//! Define numeric_limits for the custom type.
</span>
375 <span class=
"keyword">namespace
</span> <span class=
"identifier">std
</span>
376 <span class=
"special">{
</span>
377 <span class=
"keyword">template
</span><span class=
"special"><></span>
378 <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>
379 <span class=
"special">{
</span>
380 <span class=
"keyword">public
</span><span class=
"special">:
</span>
382 <span class=
"comment">//! Limit our Double to a range of +/-
100.0</span>
383 <span class=
"keyword">static
</span> <span class=
"identifier">Double
</span> <span class=
"special">(
</span><span class=
"identifier">min
</span><span class=
"special">)()
</span>
384 <span class=
"special">{
</span>
385 <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>
386 <span class=
"special">}
</span>
388 <span class=
"keyword">static
</span> <span class=
"identifier">Double
</span> <span class=
"special">(
</span><span class=
"identifier">max
</span><span class=
"special">)()
</span>
389 <span class=
"special">{
</span>
390 <span class=
"keyword">return
</span> <span class=
"identifier">Double
</span><span class=
"special">(
</span><span class=
"number">1.e2
</span><span class=
"special">);
</span>
391 <span class=
"special">}
</span>
393 <span class=
"keyword">static
</span> <span class=
"identifier">Double
</span> <span class=
"identifier">epsilon
</span><span class=
"special">()
</span>
394 <span class=
"special">{
</span>
395 <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>
396 <span class=
"special">}
</span>
397 <span class=
"special">};
</span>
398 <span class=
"special">}
</span>
400 <span class=
"comment">//! Define range checking and overflow policies.
</span>
401 <span class=
"keyword">namespace
</span> <span class=
"identifier">custom
</span>
402 <span class=
"special">{
</span>
403 <span class=
"comment">//! Define a custom range checker
</span>
404 <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>
405 <span class=
"keyword">struct
</span> <span class=
"identifier">range_checker
</span>
406 <span class=
"special">{
</span>
407 <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>
408 <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>
409 <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>
411 <span class=
"comment">//! Check range of integral types.
</span>
412 <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>
413 <span class=
"special">{
</span>
414 <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>
415 <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>
416 <span class=
"keyword">return
</span> <span class=
"identifier">cPosOverflow
</span><span class=
"special">;
</span>
417 <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>
418 <span class=
"keyword">return
</span> <span class=
"identifier">cNegOverflow
</span><span class=
"special">;
</span>
419 <span class=
"keyword">else
</span>
420 <span class=
"keyword">return
</span> <span class=
"identifier">cInRange
</span><span class=
"special">;
</span>
421 <span class=
"special">}
</span>
423 <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>
424 <span class=
"special">{
</span>
425 <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>
426 <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>
427 <span class=
"special">}
</span>
428 <span class=
"special">};
</span>
430 <span class=
"comment">//! Overflow handler
</span>
431 <span class=
"keyword">struct
</span> <span class=
"identifier">positive_overflow
</span><span class=
"special">{};
</span>
432 <span class=
"keyword">struct
</span> <span class=
"identifier">negative_overflow
</span><span class=
"special">{};
</span>
434 <span class=
"keyword">struct
</span> <span class=
"identifier">overflow_handler
</span>
435 <span class=
"special">{
</span>
436 <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>
437 <span class=
"special">{
</span>
438 <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>
439 <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>
440 <span class=
"keyword">throw
</span> <span class=
"identifier">negative_overflow
</span><span class=
"special">()
</span> <span class=
"special">;
</span>
441 <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>
442 <span class=
"keyword">throw
</span> <span class=
"identifier">positive_overflow
</span><span class=
"special">()
</span> <span class=
"special">;
</span>
443 <span class=
"special">}
</span>
444 <span class=
"special">};
</span>
446 <span class=
"comment">//! Define a rounding policy and specialize on the custom type.
</span>
447 <span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span> <span class=
"identifier">S
</span><span class=
"special">></span>
448 <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>
450 <span class=
"keyword">template
</span><span class=
"special"><></span>
451 <span class=
"keyword">struct
</span> <span class=
"identifier">Ceil
</span><span class=
"special"><</span><span class=
"identifier">Double
</span><span class=
"special">></span>
452 <span class=
"special">{
</span>
453 <span class=
"keyword">typedef
</span> <span class=
"identifier">Double
</span> <span class=
"identifier">source_type
</span><span class=
"special">;
</span>
455 <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>
457 <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>
458 <span class=
"special">{
</span>
459 <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>
460 <span class=
"keyword">using
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">ceil
</span> <span class=
"special">;
</span>
461 <span class=
"preprocessor">#endif
</span>
462 <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>
463 <span class=
"special">}
</span>
465 <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>
466 <span class=
"special">};
</span>
468 <span class=
"comment">//! Define a rounding policy and specialize on the custom type.
</span>
469 <span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">class
</span> <span class=
"identifier">S
</span><span class=
"special">></span>
470 <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>
472 <span class=
"keyword">template
</span><span class=
"special"><></span>
473 <span class=
"keyword">struct
</span> <span class=
"identifier">Trunc
</span><span class=
"special"><</span><span class=
"identifier">Double
</span><span class=
"special">></span>
474 <span class=
"special">{
</span>
475 <span class=
"keyword">typedef
</span> <span class=
"identifier">Double
</span> <span class=
"identifier">source_type
</span><span class=
"special">;
</span>
477 <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>
479 <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>
480 <span class=
"special">{
</span>
481 <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>
482 <span class=
"keyword">using
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">floor
</span><span class=
"special">;
</span>
483 <span class=
"preprocessor">#endif
</span>
484 <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>
485 <span class=
"special">}
</span>
487 <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>
488 <span class=
"special">};
</span>
489 <span class=
"special">}//
</span><span class=
"keyword">namespace
</span> <span class=
"identifier">custom
</span><span class=
"special">;
</span>
491 <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>
493 <span class=
"comment">//! Define the numeric_cast_traits specializations on the custom type.
</span>
494 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">S
</span><span class=
"special">></span>
495 <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>
496 <span class=
"special">{
</span>
497 <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>
498 <span class=
"keyword">typedef
</span> <span class=
"identifier">custom
</span><span class=
"special">::
</span><span class=
"identifier">range_checker
</span>
499 <span class=
"special"><</span>
500 <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>
501 <span class=
"special">,
</span> <span class=
"identifier">overflow_policy
</span>
502 <span class=
"special">></span> <span class=
"identifier">range_checking_policy
</span><span class=
"special">;
</span>
503 <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>
504 <span class=
"special">};
</span>
506 <span class=
"keyword">template
</span> <span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
507 <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>
508 <span class=
"special">{
</span>
509 <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>
510 <span class=
"keyword">typedef
</span> <span class=
"identifier">custom
</span><span class=
"special">::
</span><span class=
"identifier">range_checker
</span>
511 <span class=
"special"><</span>
512 <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>
513 <span class=
"special">,
</span> <span class=
"identifier">overflow_policy
</span>
514 <span class=
"special">></span> <span class=
"identifier">range_checking_policy
</span><span class=
"special">;
</span>
515 <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>
516 <span class=
"special">};
</span>
518 <span class=
"comment">//! Define the conversion from the custom type to built-in types and vice-versa.
</span>
519 <span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">></span>
520 <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>
521 <span class=
"special">{
</span>
522 <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>
523 <span class=
"special">{
</span>
524 <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>
525 <span class=
"special">}
</span>
526 <span class=
"special">};
</span>
528 <span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">S
</span><span class=
"special">></span>
529 <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>
530 <span class=
"special">{
</span>
531 <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>
532 <span class=
"special">{
</span>
533 <span class=
"keyword">return
</span> <span class=
"identifier">Double
</span><span class=
"special">(
</span><span class=
"identifier">n
</span><span class=
"special">);
</span>
534 <span class=
"special">}
</span>
535 <span class=
"special">};
</span>
536 <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>
540 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
541 <td align=
"left"></td>
542 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2004-
2007 Fernando
543 Luis Cacciola Carballal
<p>
544 Distributed under the Boost Software License, Version
1.0. (See accompanying
545 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>)
550 <div class=
"spirit-nav">
551 <a accesskey=
"p" href=
"converter___function_object.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><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=
"n" href=
"bounds___traits_class.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>