safe.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>safe&lt;T, PP, EP&gt;</title>
  5. <link rel="stylesheet" href="boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="index.html" title="Safe Numerics">
  8. <link rel="up" href="types.html" title="Types">
  9. <link rel="prev" href="types.html" title="Types">
  10. <link rel="next" href="safe_range.html" title="safe_signed_range&lt;MIN, MAX, PP, EP&gt; and safe_unsigned_range&lt;MIN, MAX, PP, EP&gt;">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img href="index.html" height="164px" src="pre-boost.jpg" alt="Library Documentation Index"></td>
  15. <td><h2>Safe Numerics</h2></td>
  16. </tr></table>
  17. <div class="spirit-nav">
  18. <a accesskey="p" href="types.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="types.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="safe_range.html"><img src="images/next.png" alt="Next"></a>
  19. </div>
  20. <div class="section">
  21. <div class="titlepage"><div><div><h3 class="title">
  22. <a name="safe_numerics.safe"></a>safe&lt;T, PP, EP&gt;</h3></div></div></div>
  23. <div class="toc"><dl class="toc">
  24. <dt><span class="section"><a href="safe.html#idm130203562112">Description</a></span></dt>
  25. <dt><span class="section"><a href="safe.html#idm130203560112">Model of</a></span></dt>
  26. <dt><span class="section"><a href="safe.html#idm130203556080">Notation</a></span></dt>
  27. <dt><span class="section"><a href="safe.html#idm130203548784">Associated Types</a></span></dt>
  28. <dt><span class="section"><a href="safe.html#idm130203541744">Template Parameters</a></span></dt>
  29. <dt><span class="section"><a href="safe.html#idm130203523280">Valid Expressions</a></span></dt>
  30. <dt><span class="section"><a href="safe.html#idm130203517392">Examples of use</a></span></dt>
  31. <dt><span class="section"><a href="safe.html#idm130203247744">Header</a></span></dt>
  32. </dl></div>
  33. <div class="section">
  34. <div class="titlepage"><div><div><h4 class="title">
  35. <a name="idm130203562112"></a>Description</h4></div></div></div>
  36. <p>A <code class="computeroutput">safe&lt;T, PP , EP&gt;</code> can be used anywhere a type T
  37. can be used. Any expression which uses this type is guaranteed to return
  38. an arithmetically correct value or to trap in some way.</p>
  39. </div>
  40. <div class="section">
  41. <div class="titlepage"><div><div><h4 class="title">
  42. <a name="idm130203560112"></a>Model of</h4></div></div></div>
  43. <p><a class="link" href="numeric.html" title="Numeric&lt;T&gt;">Integer</a></p>
  44. <p><a class="link" href="safe_numeric_concept.html" title="SafeNumeric&lt;T&gt;">SafeNumeric</a></p>
  45. <p>This type inherits all the notation, associated types and template
  46. parameters and valid expressions of <a class="link" href="safe_numeric_concept.html" title="SafeNumeric&lt;T&gt;">SafeNumeric</a> types. The
  47. following specify additional features of this type.</p>
  48. </div>
  49. <div class="section">
  50. <div class="titlepage"><div><div><h4 class="title">
  51. <a name="idm130203556080"></a>Notation</h4></div></div></div>
  52. <div class="informaltable"><table class="table">
  53. <colgroup>
  54. <col align="left">
  55. <col align="left">
  56. </colgroup>
  57. <thead><tr>
  58. <th align="left">Symbol</th>
  59. <th align="left">Description</th>
  60. </tr></thead>
  61. <tbody><tr>
  62. <td align="left"><code class="computeroutput">T</code></td>
  63. <td align="left">Underlying type from which a safe type is being
  64. derived</td>
  65. </tr></tbody>
  66. </table></div>
  67. </div>
  68. <div class="section">
  69. <div class="titlepage"><div><div><h4 class="title">
  70. <a name="idm130203548784"></a>Associated Types</h4></div></div></div>
  71. <div class="informaltable"><table class="table">
  72. <colgroup>
  73. <col align="left">
  74. <col align="left">
  75. </colgroup>
  76. <tbody>
  77. <tr>
  78. <td align="left"><code class="computeroutput">PP</code></td>
  79. <td align="left">A type which specifies the result type of an expression
  80. using safe types.</td>
  81. </tr>
  82. <tr>
  83. <td align="left"><code class="computeroutput">EP</code></td>
  84. <td align="left">A type containing members which are called when a correct
  85. result cannot be returned</td>
  86. </tr>
  87. </tbody>
  88. </table></div>
  89. </div>
  90. <div class="section">
  91. <div class="titlepage"><div><div><h4 class="title">
  92. <a name="idm130203541744"></a>Template Parameters</h4></div></div></div>
  93. <div class="informaltable"><table class="table">
  94. <colgroup>
  95. <col>
  96. <col align="left">
  97. <col align="left">
  98. </colgroup>
  99. <thead><tr>
  100. <th align="left">Parameter</th>
  101. <th align="left">Type Requirements</th>
  102. <th align="left">Description</th>
  103. </tr></thead>
  104. <tbody>
  105. <tr>
  106. <td><code class="computeroutput">T</code></td>
  107. <td align="left"><a href="http://en.cppreference.com/w/cpp/types/is_integral" target="_top">Integer&lt;T&gt;</a></td>
  108. <td align="left"><p>The underlying type. Currently only integer types are
  109. supported</p></td>
  110. </tr>
  111. <tr>
  112. <td><code class="computeroutput">PP</code></td>
  113. <td align="left"><a class="link" href="numeric.html" title="Numeric&lt;T&gt;">PromotionPolicy&lt;PP&gt;</a></td>
  114. <td align="left"><p>Optional promotion policy. Default value is <a class="link" href="promotion_policies/native.html" title="native"><code class="computeroutput">boost::numeric::native</code></a></p></td>
  115. </tr>
  116. <tr>
  117. <td><code class="computeroutput">EP</code></td>
  118. <td align="left"><a class="link" href="numeric.html" title="Numeric&lt;T&gt;">Exception
  119. Policy&lt;EP&gt;</a></td>
  120. <td align="left"><p>Optional exception policy. Default value is <a class="link" href="exception_policies.html#safe_numerics.exception_policies.default_exception_policy"><code class="computeroutput">boost::numeric::default_exception_policy</code></a></p></td>
  121. </tr>
  122. </tbody>
  123. </table></div>
  124. <p>See examples below.</p>
  125. </div>
  126. <div class="section">
  127. <div class="titlepage"><div><div><h4 class="title">
  128. <a name="idm130203523280"></a>Valid Expressions</h4></div></div></div>
  129. <p>Implements all expressions and only those expressions defined by the
  130. <a class="link" href="safe_numeric_concept.html" title="SafeNumeric&lt;T&gt;">SafeNumeric</a>&lt;T&gt;
  131. type requirements. Note that all these expressions are
  132. <code class="computeroutput">constexpr</code>. Thus, the result type of such an expression will
  133. be another safe type. The actual type of the result of such an expression
  134. will depend upon the specific promotion policy template parameter.</p>
  135. <p>When a binary operand is applied to two instances of safe&lt;T, PP,
  136. EP&gt;on of the following must be true:</p>
  137. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  138. <li class="listitem"><p>The promotion policies of the two operands must be the same or
  139. one of them must be void</p></li>
  140. <li class="listitem"><p>The exception policies of the two operands must be the same or
  141. one of them must be void</p></li>
  142. </ul></div>
  143. <p>If either of the above is not true, a compile error will
  144. result.</p>
  145. </div>
  146. <div class="section">
  147. <div class="titlepage"><div><div><h4 class="title">
  148. <a name="idm130203517392"></a>Examples of use</h4></div></div></div>
  149. <p>The most common usage would be safe&lt;T&gt; which uses the default
  150. promotion and exception policies. This type is meant to be a "drop-in"
  151. replacement of the intrinsic integer types. That is, expressions involving
  152. these types will be evaluated into result types which reflect the standard
  153. rules for evaluation of C++ expressions. Should it occur that such
  154. evaluation cannot return a correct result, an exception will be
  155. thrown.</p>
  156. <p>There are two aspects of the operation of this type which can be
  157. customized with a policy. The first is the result type of an arithmetic
  158. operation. C++ defines the rules which define this result type in terms of
  159. the constituent types of the operation. Here we refer to these rules as
  160. "type promotion" rules. These rules will sometimes result in a type which
  161. cannot hold the actual arithmetic result of the operation. This is the
  162. main motivation for making this library in the first place. One way to
  163. deal with this problem is to substitute our own type promotion rules for
  164. the C++ ones.</p>
  165. <div class="section">
  166. <div class="titlepage"><div><div><h5 class="title">
  167. <a name="safe_numerics.drop_in_replacement"></a>As a Drop-in replacement for standard integer types.</h5></div></div></div>
  168. <p>The following program will throw an exception and emit an error
  169. message at runtime if any of several events result in an incorrect
  170. arithmetic result. Behavior of this program could vary according to the
  171. machine architecture in question.</p>
  172. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">exception</span><span class="special">&gt;</span>
  173. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  174. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  175. <span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
  176. <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>
  177. <span class="identifier">safe</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">j</span><span class="special">;</span>
  178. <span class="keyword">try</span> <span class="special">{</span>
  179. <span class="identifier">safe</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">i</span><span class="special">;</span>
  180. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">i</span><span class="special">;</span> <span class="comment">// could overflow !</span>
  181. <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">i</span> <span class="special">*</span> <span class="identifier">i</span><span class="special">;</span> <span class="comment">// could overflow</span>
  182. <span class="special">}</span>
  183. <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span> <span class="special">&amp;</span> <span class="identifier">e</span><span class="special">)</span><span class="special">{</span>
  184. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">(</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
  185. <span class="special">}</span>
  186. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">j</span><span class="special">;</span>
  187. <span class="special">}</span></pre>
  188. <p>The term "drop-in replacement" reveals the aspiration of
  189. this library. In most cases, this aspiration is realized. In the
  190. following example, the normal implicit conversions function the same for
  191. safe integers as they do for built-in integers. </p>
  192. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  193. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">;</span>
  194. <span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span><span class="special">{</span>
  195. <span class="keyword">return</span> <span class="identifier">i</span><span class="special">;</span>
  196. <span class="special">}</span>
  197. <span class="keyword">using</span> <span class="identifier">safe_t</span> <span class="special">=</span> <span class="identifier">safe</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">&gt;</span><span class="special">;</span>
  198. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
  199. <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">97</span><span class="special">;</span>
  200. <span class="identifier">f</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span><span class="special">;</span> <span class="comment">// OK - implicit conversion to int</span>
  201. <span class="keyword">const</span> <span class="identifier">safe_t</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">97</span><span class="special">;</span>
  202. <span class="identifier">f</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span><span class="special">;</span> <span class="comment">// Also OK - checked implicit conversion to int</span>
  203. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  204. <span class="special">}</span></pre>
  205. <p>When
  206. the <code class="computeroutput">safe&lt;long&gt;</code> is implicitly converted to an
  207. <code class="computeroutput">int</code> when calling <code class="computeroutput">f</code>, the value is checked to be
  208. sure that it is within the legal range of an int and will invoke an
  209. exception if it cannot. We can easily verify this by altering the
  210. exception handling policy in the above example to
  211. <code class="computeroutput">loose_trap_policy</code>. This will invoke a compile time error on
  212. any conversion might invoke a runtime exception.</p>
  213. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  214. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">;</span>
  215. <span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span><span class="special">{</span>
  216. <span class="keyword">return</span> <span class="identifier">i</span><span class="special">;</span>
  217. <span class="special">}</span>
  218. <span class="keyword">using</span> <span class="identifier">safe_t</span> <span class="special">=</span> <span class="identifier">safe</span><span class="special">&lt;</span><span class="keyword">long</span><span class="special">,</span> <span class="identifier">native</span><span class="special">,</span> <span class="identifier">loose_trap_policy</span><span class="special">&gt;</span><span class="special">;</span>
  219. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
  220. <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">97</span><span class="special">;</span>
  221. <span class="identifier">f</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span><span class="special">;</span> <span class="comment">// OK - implicit conversion to int</span>
  222. <span class="keyword">const</span> <span class="identifier">safe_t</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">97</span><span class="special">;</span>
  223. <span class="identifier">f</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span><span class="special">;</span> <span class="comment">// Would be OK, but will invoke compile time error</span>
  224. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  225. <span class="special">}</span></pre>
  226. <p>But this raises it's own questions. We can see that in this
  227. example, the program can never fail:</p>
  228. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  229. <li class="listitem"><p>The value 97 is assigned to y</p></li>
  230. <li class="listitem"><p>y is converted to an int</p></li>
  231. <li class="listitem"><p>and used as an argument to f</p></li>
  232. </ul></div>
  233. <p>The conversion can never fail because the value of 97 can always
  234. fit into an int. But the library code can't detect this and emits the
  235. checking code even though it's not necessary.</p>
  236. <p>This can be addressed by using a <a class="link" href="safe_literal.html" title="safe_signed_literal&lt;Value, PP , EP&gt; and safe_unsigned_literal&lt;Value, PP, EP&gt;"><code class="computeroutput">safe_literal</code></a>. A
  237. safe literal can contain one and only one value. All the functions in
  238. this library are marked <code class="computeroutput">constexpr</code>. So it can be determined
  239. at compile time that conversion to an <code class="computeroutput">int</code> can never fail
  240. and no runtime checking code need be emitted. Making this small change
  241. will permit the above example to run with zero runtime overhead while
  242. guaranteeing that no error can ever occur.</p>
  243. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  244. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer_literal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  245. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">safe_numerics</span><span class="special">;</span>
  246. <span class="keyword">int</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span><span class="special">{</span>
  247. <span class="keyword">return</span> <span class="identifier">i</span><span class="special">;</span>
  248. <span class="special">}</span>
  249. <span class="keyword">template</span><span class="special">&lt;</span><span class="identifier">intmax_t</span> <span class="identifier">N</span><span class="special">&gt;</span>
  250. <span class="keyword">using</span> <span class="identifier">safe_literal</span> <span class="special">=</span> <span class="identifier">safe_signed_literal</span><span class="special">&lt;</span><span class="identifier">N</span><span class="special">,</span> <span class="identifier">native</span><span class="special">,</span> <span class="identifier">loose_trap_policy</span><span class="special">&gt;</span><span class="special">;</span>
  251. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
  252. <span class="keyword">const</span> <span class="keyword">long</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">97</span><span class="special">;</span>
  253. <span class="identifier">f</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span><span class="special">;</span> <span class="comment">// OK - implicit conversion to int</span>
  254. <span class="keyword">const</span> <span class="identifier">safe_literal</span><span class="special">&lt;</span><span class="number">97</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">;</span>
  255. <span class="identifier">f</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span><span class="special">;</span> <span class="comment">// OK - y is a type with min/max = 97;</span>
  256. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  257. <span class="special">}</span></pre>
  258. <p>With this trivial example, such efforts would hardly be deemed
  259. necessary. But in a more complex case, perhaps including compile time
  260. arithmetic expressions, it could be much more difficult to verify that
  261. the constant is valid and/or no checking code is needed. And there is
  262. also possibility that over the life time of the application, the compile
  263. time constants might change, thus rendering any ad hoc analyse obsolete.
  264. Using <a class="link" href="safe_literal.html" title="safe_signed_literal&lt;Value, PP , EP&gt; and safe_unsigned_literal&lt;Value, PP, EP&gt;"><code class="computeroutput">safe_literal</code></a>
  265. will future-proof your code against well-meaning, but code-breaking
  266. updates.</p>
  267. </div>
  268. <div class="section">
  269. <div class="titlepage"><div><div><h5 class="title">
  270. <a name="idm130203320752"></a>Adjust type promotion rules.</h5></div></div></div>
  271. <p>Another way to avoid arithmetic errors like overflow is to promote
  272. types to larger sizes before doing the arithmetic.</p>
  273. <p>Stepping back, we can see that many of the cases of invalid
  274. arithmetic wouldn't exist if the result types were larger. So we can
  275. avoid these problems by replacing the C++ type promotion rules for
  276. expressions with our own rules. This can be done by specifying a
  277. promotion policy <code class="computeroutput"><code class="computeroutput">automatic</code></code>. The policy stores
  278. the result of an expression in the smallest size type that can
  279. accommodate the largest value that an expression can yield. No checking
  280. for exceptions is necessary. The following example illustrates
  281. this.</p>
  282. <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">safe_integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  283. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  284. <span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">char</span><span class="special">[</span><span class="special">]</span><span class="special">)</span><span class="special">{</span>
  285. <span class="keyword">using</span> <span class="identifier">safe_int</span> <span class="special">=</span> <span class="identifier">safe</span><span class="special">&lt;</span>
  286. <span class="keyword">int</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">automatic</span><span class="special">,</span>
  287. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">default_exception_policy</span>
  288. <span class="special">&gt;</span><span class="special">;</span>
  289. <span class="identifier">safe_int</span> <span class="identifier">i</span><span class="special">;</span>
  290. <span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span> <span class="special">&gt;&gt;</span> <span class="identifier">i</span><span class="special">;</span> <span class="comment">// might throw exception</span>
  291. <span class="keyword">auto</span> <span class="identifier">j</span> <span class="special">=</span> <span class="identifier">i</span> <span class="special">*</span> <span class="identifier">i</span><span class="special">;</span> <span class="comment">// won't ever trap - result type can hold the maximum value of i * i</span>
  292. <span class="identifier">static_assert</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">is_safe</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">j</span><span class="special">)</span><span class="special">&gt;</span><span class="special">::</span><span class="identifier">value</span><span class="special">)</span><span class="special">;</span> <span class="comment">// result is another safe type</span>
  293. <span class="identifier">static_assert</span><span class="special">(</span>
  294. <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">decltype</span><span class="special">(</span><span class="identifier">i</span> <span class="special">*</span> <span class="identifier">i</span><span class="special">)</span><span class="special">&gt;</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="special">)</span> <span class="special">&gt;=</span>
  295. <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">safe_int</span><span class="special">&gt;</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">safe_int</span><span class="special">&gt;</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="special">)</span>
  296. <span class="special">)</span><span class="special">;</span> <span class="comment">// always true</span>
  297. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  298. <span class="special">}</span></pre>
  299. </div>
  300. </div>
  301. <div class="section">
  302. <div class="titlepage"><div><div><h4 class="title">
  303. <a name="idm130203247744"></a>Header</h4></div></div></div>
  304. <p><code class="filename"><a href="../../include/safe_integer.hpp" target="_top">#include
  305. &lt;boost/numeric/safe_numerics/safe_integer.hpp&gt;</a></code></p>
  306. </div>
  307. </div>
  308. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  309. <td align="left"></td>
  310. <td align="right"><div class="copyright-footer">Copyright &#169; 2012-2018 Robert Ramey<p><a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">Subject to Boost
  311. Software License</a></p>
  312. </div></td>
  313. </tr></table>
  314. <hr>
  315. <div class="spirit-nav">
  316. <a accesskey="p" href="types.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="types.html"><img src="images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="images/home.png" alt="Home"></a><a accesskey="n" href="safe_range.html"><img src="images/next.png" alt="Next"></a>
  317. </div>
  318. </body>
  319. </html>