Imported Upstream version 1.49.0
[platform/upstream/boost.git] / libs / numeric / conversion / doc / html / boost_numericconversion / numeric_converter_policy_classes.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Numeric Converter Policy Classes</title>
5 <link rel="stylesheet" href="../boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1">
7 <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Boost.NumericConversion">
8 <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Boost.NumericConversion">
9 </head>
10 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
11 <table cellpadding="2" width="100%"><tr>
12 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
13 <td align="center"><a href="../../../../../../index.html">Home</a></td>
14 <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
15 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
16 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
17 <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
18 </tr></table>
19 <hr>
20 <div class="spirit-nav">
21 <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>
22 </div>
23 <div class="section">
24 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
25 <a name="boost_numericconversion.numeric_converter_policy_classes"></a><a class="link" href="numeric_converter_policy_classes.html" title="Numeric Converter Policy Classes">Numeric
26     Converter Policy Classes</a>
27 </h2></div></div></div>
28     
29     <div class="section">
30 <div class="titlepage"><div><div><h3 class="title">
31 <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
32       range_check_result</a>
33 </h3></div></div></div>
34       
35 <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>
36
37     <span class="keyword">enum</span> <span class="identifier">range_check_result</span>
38     <span class="special">{</span>
39         <span class="identifier">cInRange</span>     <span class="special">,</span>
40         <span class="identifier">cNegOverflow</span> <span class="special">,</span>
41         <span class="identifier">cPosOverflow</span>
42     <span class="special">}</span> <span class="special">;</span>
43
44 <span class="special">}</span> <span class="special">}</span>
45 </pre>
46       <p>
47         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">&lt;&gt;::</span><span class="identifier">out_of_range</span><span class="special">()</span></code>
48       </p>
49     </div>
50     <div class="section">
51 <div class="titlepage"><div><div><h3 class="title">
52 <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
53       OverflowHandler</a>
54 </h3></div></div></div>
55       
56       <p>
57         This <span class="emphasis"><em>stateless</em></span> non-template policy class must be a
58         <span class="emphasis"><em>function object</em></span> and is called to administrate the result
59         of the range checking. It can throw an exception if overflow has been detected
60         by the range checking as indicated by its argument. If it throws, is is recommended
61         that it be <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span></code> or derived.
62       </p>
63       <p>
64         It must have the following interface (it does not has to be a template class):
65       </p>
66 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">YourOverflowHandlerPolicy</span>
67 <span class="special">{</span>
68     <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>
69 <span class="special">}</span> <span class="special">;</span>
70 </pre>
71       <p>
72         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>.
73       </p>
74       <p>
75         These are the two overflow handler classes provided by the library:
76       </p>
77 <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>
78
79     <span class="keyword">struct</span> <span class="identifier">def_overflow_handler</span>
80     <span class="special">{</span>
81         <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>
82         <span class="special">{</span>
83             <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>
84                 <span class="keyword">throw</span> <span class="identifier">negative_overflow</span><span class="special">()</span> <span class="special">;</span>
85             <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>
86                 <span class="keyword">throw</span> <span class="identifier">positive_overflow</span><span class="special">()</span> <span class="special">;</span>
87         <span class="special">}</span>
88     <span class="special">}</span> <span class="special">;</span>
89
90     <span class="keyword">struct</span> <span class="identifier">silent_overflow_handler</span>
91     <span class="special">{</span>
92         <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>
93         <span class="special">{}</span>
94     <span class="special">}</span> <span class="special">;</span>
95
96 <span class="special">}</span> <span class="special">}</span>
97 </pre>
98       <p>
99         And these are the Exception Classes thrown by the default overflow handler
100         <a class="link" href="numeric_converter_policy_classes.html#numeric_conversion_policy_overflow_handler_important_note">(see
101         IMPORTANT note)</a>
102       </p>
103 <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>
104
105     <a name="numeric_conversion_bad_numeric_cast"></a>
106     <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>
107     <span class="special">{</span>
108         <span class="keyword">public</span><span class="special">:</span>
109         <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>
110         <span class="special">{</span>
111             <span class="keyword">return</span> <span class="string">"bad numeric conversion: overflow"</span><span class="special">;</span>
112         <span class="special">}</span>
113
114     <span class="special">};</span>
115
116     <a name="numeric_conversion_negative_overflow"></a>
117     <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>
118     <span class="special">{</span>
119         <span class="keyword">public</span><span class="special">:</span>
120         <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>
121         <span class="special">{</span>
122             <span class="keyword">return</span> <span class="string">"bad numeric conversion: negative overflow"</span><span class="special">;</span>
123         <span class="special">}</span>
124     <span class="special">};</span>
125
126     <a name="numeric_conversion_possitive_overflow"></a>
127     <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>
128     <span class="special">{</span>
129         <span class="keyword">public</span><span class="special">:</span>
130         <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>
131         <span class="special">{</span>
132             <span class="keyword">return</span> <span class="string">"bad numeric conversion: positive overflow"</span><span class="special">;</span>
133         <span class="special">}</span>
134     <span class="special">};</span>
135
136
137 <span class="special">}</span> <span class="special">}</span>
138 </pre>
139       <a name="numeric_conversion_policy_overflow_handler_important_note"></a>
140       <div class="important"><table border="0" summary="Important">
141 <tr>
142 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
143 <th align="left">Important</th>
144 </tr>
145 <tr><td align="left" valign="top">
146         <p>
147           <span class="bold"><strong>RELEASE NOTE for 1.33</strong></span> Previous to boost
148           version 1.33, the exception class <code class="computeroutput"><span class="identifier">bad_numeric_cast</span></code>
149           was named <code class="computeroutput"><span class="identifier">bad_numeric_conversion</span></code>.
150           However, in 1.33, the old function <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special">&lt;&gt;</span></code> from <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cast</span><span class="special">.</span><span class="identifier">hpp</span></code>
151           was completly replaced by the new <code class="computeroutput"><span class="identifier">numeric_cast</span><span class="special">&lt;&gt;</span></code> in <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</span><span class="special">/</span><span class="identifier">cast</span><span class="special">.</span><span class="identifier">hpp</span></code>
152           (and <code class="computeroutput"><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cast</span><span class="special">.</span><span class="identifier">hpp</span></code> is including <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</span><span class="special">/</span><span class="identifier">cast</span><span class="special">.</span><span class="identifier">hpp</span></code>
153           now). That old function which existed in boost for quite some time used
154           the <code class="computeroutput"><span class="identifier">bad_numeric_cast</span></code> as
155           its exception type so I decided to avoid backward compatibility problems
156           by adopting it (guessing that the user base for the old code is wider than
157           for the new code).
158         </p>
159       </td></tr>
160 </table></div>
161     </div>
162     <div class="section">
163 <div class="titlepage"><div><div><h3 class="title">
164 <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
165       Float2IntRounder</a>
166 </h3></div></div></div>
167       
168       <p>
169         This <span class="emphasis"><em>stateless</em></span> template policy class specifies the rounding
170         mode used for <span class="underline">float to integral</span> conversions.
171         It supplies the <code class="computeroutput"><span class="identifier">nearbyint</span><span class="special">()</span></code> static member function exposed by the converter,
172         which means that it <span class="underline">publicly inherits from this
173         policy</span>.
174       </p>
175       <p>
176         The policy must have the following interface:
177       </p>
178 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span>
179 <span class="keyword">struct</span> <span class="identifier">YourFloat2IntRounderPolicy</span>
180 <span class="special">{</span>
181     <span class="keyword">typedef</span> <span class="identifier">S</span>               <span class="identifier">source_type</span> <span class="special">;</span>
182     <span class="keyword">typedef</span> <span class="special">{</span><span class="identifier">S</span> <span class="keyword">or</span> <span class="identifier">S</span> <span class="keyword">const</span><span class="special">&amp;}</span> <span class="identifier">argument_type</span> <span class="special">;</span>
183
184     <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="special">...</span> <span class="special">}</span>
185
186     <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</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_</span><span class="special">...&gt;</span> <span class="identifier">round_style</span> <span class="special">;</span>
187
188 <span class="special">}</span> <span class="special">;</span>
189 </pre>
190       <p>
191         These are the rounder classes provided by the library (only the specific
192         parts are shown, see the general policy form above)
193       </p>
194       <div class="note"><table border="0" summary="Note">
195 <tr>
196 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
197 <th align="left">Note</th>
198 </tr>
199 <tr><td align="left" valign="top">
200         <p>
201           These classes are not intended to be general purpose rounding functions
202           but specific policies for <code class="computeroutput"><span class="identifier">converter</span><span class="special">&lt;&gt;</span></code>. This is why they are not function
203           objects.
204         </p>
205       </td></tr>
206 </table></div>
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
209
210     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span>
211     <span class="keyword">struct</span> <span class="identifier">Trunc</span>
212     <span class="special">{</span>
213         <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>
214         <span class="special">{</span>
215             <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">floor</span> <span class="special">;</span>
216             <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ceil</span>  <span class="special">;</span>
217
218             <span class="keyword">return</span> <span class="identifier">s</span> <span class="special">&gt;=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">S</span><span class="special">&gt;(</span><span class="number">0</span><span class="special">)</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="special">:</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
219         <span class="special">}</span>
220
221         <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</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">&gt;</span> <span class="identifier">round_style</span> <span class="special">;</span>
222     <span class="special">}</span> <span class="special">;</span>
223
224
225     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span>
226     <span class="keyword">struct</span> <span class="identifier">RoundEven</span>
227     <span class="special">{</span>
228         <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>
229         <span class="special">{</span>
230             <span class="keyword">return</span> <span class="identifier">impl</span><span class="special">-</span><span class="identifier">defined</span><span class="special">-</span><span class="identifier">value</span> <span class="special">;</span>
231         <span class="special">}</span>
232
233         <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</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_to_nearest</span><span class="special">&gt;</span> <span class="identifier">round_style</span> <span class="special">;</span>
234     <span class="special">}</span> <span class="special">;</span>
235
236
237     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span>
238     <span class="keyword">struct</span> <span class="identifier">Ceil</span>
239     <span class="special">{</span>
240         <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>
241         <span class="special">{</span>
242             <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ceil</span> <span class="special">;</span>
243             <span class="keyword">return</span> <span class="identifier">ceil</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
244         <span class="special">}</span>
245
246         <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</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">&gt;</span> <span class="identifier">round_style</span> <span class="special">;</span>
247     <span class="special">}</span> <span class="special">;</span>
248
249
250     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">S</span><span class="special">&gt;</span>
251     <span class="keyword">struct</span> <span class="identifier">Floor</span>
252     <span class="special">{</span>
253         <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>
254         <span class="special">{</span>
255             <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">floor</span> <span class="special">;</span>
256             <span class="keyword">return</span> <span class="identifier">floor</span><span class="special">(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
257         <span class="special">}</span>
258         <span class="keyword">typedef</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">integral_c</span><span class="special">&lt;</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">&gt;</span> <span class="identifier">round_style</span> <span class="special">;</span>
259     <span class="special">}</span> <span class="special">;</span>
260
261 <span class="special">}</span> <span class="special">}</span> <span class="comment">// namespace numeric, namespace boost</span>
262 </pre>
263       <h5>
264 <a name="boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder.h0"></a>
265         <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
266         Functions used by the rounder policies</a>
267       </h5>
268       <p>
269         The rounder policies supplied by this header use math functions <code class="computeroutput"><span class="identifier">floor</span><span class="special">()</span></code>
270         and <code class="computeroutput"><span class="identifier">ceil</span><span class="special">()</span></code>.
271         The standard versions of these functions are introduced in context by a using
272         directive, so in normal conditions, the standard functions will be used.
273       </p>
274       <p>
275         However, if there are other visible corresponding overloads an ambiguity
276         could arise. In this case, the user can supply her own rounder policy which
277         could, for instance, use a fully qualified call.
278       </p>
279       <p>
280         This technique allows the default rounder policies to be used directly with
281         user defined types. The user only requires that suitable overloads of <code class="computeroutput"><span class="identifier">floor</span><span class="special">()</span></code>
282         and <code class="computeroutput"><span class="identifier">ceil</span><span class="special">()</span></code>
283         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
284         Defined Numeric Types</a> support.
285       </p>
286     </div>
287     <div class="section">
288 <div class="titlepage"><div><div><h3 class="title">
289 <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
290       RawConverter</a>
291 </h3></div></div></div>
292       
293       <p>
294         This <span class="emphasis"><em>stateless</em></span> template policy class is used to perform
295         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>
296         static member function exposed by the converter, which means that it publicly
297         inherits from this policy.
298       </p>
299       <p>
300         The policy must have the following interface:
301       </p>
302 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
303 <span class="keyword">struct</span> <span class="identifier">YourRawConverterPolicy</span>
304 <span class="special">{</span>
305     <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>
306     <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>
307
308     <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">&lt;</span><span class="identifier">impl</span> <span class="identifier">defined</span><span class="special">&gt;</span> <span class="special">;</span> <span class="special">}</span>
309 <span class="special">}</span> <span class="special">;</span>
310 </pre>
311       <p>
312         This policy is mostly provided as a hook for user defined types which don't
313         support <code class="computeroutput"><span class="keyword">static_cast</span><span class="special">&lt;&gt;</span></code>
314         conversions to some types
315       </p>
316       <p>
317         This is the only raw converter policy class provided by the library:
318       </p>
319 <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>
320
321     <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
322     <span class="keyword">struct</span> <span class="identifier">raw_numeric_converter</span>
323     <span class="special">{</span>
324         <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>
325         <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>
326
327         <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>
328         <span class="special">{</span>
329             <span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">result_type</span><span class="special">&gt;(</span><span class="identifier">s</span><span class="special">)</span> <span class="special">;</span>
330         <span class="special">}</span>
331     <span class="special">}</span> <span class="special">;</span>
332
333 <span class="special">}</span> <span class="special">}</span>
334 </pre>
335     </div>
336     <div class="section">
337 <div class="titlepage"><div><div><h3 class="title">
338 <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
339       UserRangeChecker</a>
340 </h3></div></div></div>
341       
342       <p>
343         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>
344         the internal range checking logic.
345       </p>
346       <p>
347         It supplies the <code class="computeroutput"><span class="identifier">validate_range</span><span class="special">()</span></code> static member function exposed by the converter,
348         which means that it publicly inherits from this policy.
349       </p>
350       <p>
351         The policy must have the following interface:
352       </p>
353 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Traits</span><span class="special">&gt;</span>
354 <span class="keyword">struct</span> <span class="identifier">YourRangeCheckerPolicy</span>
355 <span class="special">{</span>
356     <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>
357
358     <span class="comment">// Determines if the value 's' fits in the range of the Target type.</span>
359     <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>
360
361     <span class="comment">// Checks whether the value 's' is out_of_range()</span>
362     <span class="comment">// and passes the result of the check to the OverflowHandler policy.</span>
363     <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>
364     <span class="special">{</span>
365         <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>
366     <span class="special">}</span>
367 <span class="special">}</span> <span class="special">;</span>
368 </pre>
369       <p>
370         This policy is <span class="bold"><strong>only</strong></span> provided as a hook for
371         user defined types which require range checking (which is disabled by default
372         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>
373         <code class="computeroutput"><span class="identifier">RangeChecker</span></code> policy used
374         to signal the converter to use its internal range checking implementation.
375       </p>
376     </div>
377   </div>
378 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
379 <td align="left"></td>
380 <td align="right"><div class="copyright-footer"></div></td>
381 </tr></table>
382 <hr>
383 <div class="spirit-nav">
384 <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>
385 </div>
386 </body>
387 </html>