• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4<title>interval&lt;R&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="library_implementation.html" title="Library Implementation">
9<link rel="prev" href="checked_arithmetic.html" title="Checked Arithmetic">
10<link rel="next" href="checked_integer_arithmetic.html" title="safe_compare&lt;T, U&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="checked_arithmetic.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="library_implementation.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="checked_integer_arithmetic.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.interval"></a>interval&lt;R&gt;</h3></div></div></div>
23<div class="toc"><dl class="toc">
24<dt><span class="section"><a href="interval.html#idm130202132352">Description</a></span></dt>
25<dt><span class="section"><a href="interval.html#idm130202129408">Template Parameters</a></span></dt>
26<dt><span class="section"><a href="interval.html#idm130202126048">Notation</a></span></dt>
27<dt><span class="section"><a href="interval.html#idm130202108592">Associated Types</a></span></dt>
28<dt><span class="section"><a href="interval.html#idm130202102752">Valid Expressions</a></span></dt>
29<dt><span class="section"><a href="interval.html#idm130202023104">Example of use</a></span></dt>
30<dt><span class="section"><a href="interval.html#idm130201930272">Header</a></span></dt>
31</dl></div>
32<div class="section">
33<div class="titlepage"><div><div><h4 class="title">
34<a name="idm130202132352"></a>Description</h4></div></div></div>
35<p>A closed arithmetic interval represented by a pair of elements of
36    type R. In principle, one should be able to use Boost.Interval library for
37    this. But the functions in this library are not <code class="computeroutput">constexpr</code>.
38    Also, this Boost.Interval is more complex and does not support certain
39    operations such bit operations. Perhaps some time in the future,
40    Boost.Interval will be used instead of this <code class="computeroutput">interval&lt;R&gt;</code>
41    type.</p>
42</div>
43<div class="section">
44<div class="titlepage"><div><div><h4 class="title">
45<a name="idm130202129408"></a>Template Parameters</h4></div></div></div>
46<p>R must model the type requirements of <a class="link" href="numeric.html" title="Numeric&lt;T&gt;">Numeric</a>. Note this in principle
47    includes any numeric type including floating point numbers and instances
48    of <a class="link" href="checked_result.html" title="checked_result&lt;R&gt;"><code class="computeroutput">checked_result&lt;R&gt;</code></a>.</p>
49</div>
50<div class="section">
51<div class="titlepage"><div><div><h4 class="title">
52<a name="idm130202126048"></a>Notation</h4></div></div></div>
53<div class="informaltable"><table class="table">
54<colgroup>
55<col align="left">
56<col align="left">
57</colgroup>
58<thead><tr>
59<th align="left">Symbol</th>
60<th align="left">Description</th>
61</tr></thead>
62<tbody>
63<tr>
64<td align="left"><code class="computeroutput">I</code></td>
65<td align="left">An interval type</td>
66</tr>
67<tr>
68<td align="left"><code class="computeroutput">i, j</code></td>
69<td align="left">An instance of interval type</td>
70</tr>
71<tr>
72<td align="left"><code class="computeroutput">R</code></td>
73<td align="left">Numeric types which can be used to make an interval</td>
74</tr>
75<tr>
76<td align="left"><code class="computeroutput">r</code></td>
77<td align="left">An instance of type R</td>
78</tr>
79<tr>
80<td align="left"><code class="computeroutput">p</code></td>
81<td align="left">An instance of std::pair&lt;R, R&gt;</td>
82</tr>
83<tr>
84<td align="left"><code class="computeroutput">l, u</code></td>
85<td align="left">Lowermost and uppermost values in an interval</td>
86</tr>
87<tr>
88<td align="left"><code class="computeroutput">os</code></td>
89<td align="left">std::basic_ostream&lt;class CharT, class Traits =
90            std::char_traits&lt;CharT&gt;&gt;</td>
91</tr>
92</tbody>
93</table></div>
94</div>
95<div class="section">
96<div class="titlepage"><div><div><h4 class="title">
97<a name="idm130202108592"></a>Associated Types</h4></div></div></div>
98<div class="informaltable"><table class="table">
99<colgroup>
100<col align="left">
101<col align="left">
102</colgroup>
103<tbody><tr>
104<td align="left"><a class="link" href="checked_result.html" title="checked_result&lt;R&gt;"><code class="computeroutput">checked_result</code></a></td>
105<td align="left">holds either the result of an operation or information as
106            to why it failed</td>
107</tr></tbody>
108</table></div>
109</div>
110<div class="section">
111<div class="titlepage"><div><div><h4 class="title">
112<a name="idm130202102752"></a>Valid Expressions</h4></div></div></div>
113<p>Note that all expressions are constexpr.</p>
114<div class="informaltable"><table class="table">
115<colgroup>
116<col align="left">
117<col align="left">
118<col align="left">
119</colgroup>
120<thead><tr>
121<th align="left">Expression</th>
122<th align="left">Return Type</th>
123<th align="left">Semantics</th>
124</tr></thead>
125<tbody>
126<tr>
127<td align="left"><code class="computeroutput">interval&lt;R&gt;(l, u)</code></td>
128<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
129<td align="left">construct a new interval from a pair of limits</td>
130</tr>
131<tr>
132<td align="left"><code class="computeroutput">interval&lt;R&gt;(p)</code></td>
133<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
134<td align="left">construct a new interval from a pair of limits</td>
135</tr>
136<tr>
137<td align="left"><code class="computeroutput">interval&lt;R&gt;(i)</code></td>
138<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
139<td align="left">copy constructor</td>
140</tr>
141<tr>
142<td align="left"><code class="computeroutput">make_interval&lt;R&gt;()</code></td>
143<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
144<td align="left">return new interval with
145              std::numric_limits&lt;R&gt;::min() and
146              std::numric_limits&lt;R&gt;::max()</td>
147</tr>
148<tr>
149<td align="left"><code class="computeroutput">make_interval&lt;R&gt;(const R
150              &amp;r)</code></td>
151<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
152<td align="left">return new interval with
153              std::numric_limits&lt;R&gt;::min() and
154              std::numric_limits&lt;R&gt;::max()</td>
155</tr>
156<tr>
157<td align="left"><code class="computeroutput">i.l</code></td>
158<td align="left"><code class="computeroutput">R</code></td>
159<td align="left">lowermost value in the interval i</td>
160</tr>
161<tr>
162<td align="left"><code class="computeroutput">i.u</code></td>
163<td align="left"><code class="computeroutput">R</code></td>
164<td align="left">uppermost value in the interval i</td>
165</tr>
166<tr>
167<td align="left"><code class="computeroutput">i.includes(j)</code></td>
168<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
169<td align="left">return true if interval i includes interval j</td>
170</tr>
171<tr>
172<td align="left"><code class="computeroutput">i.excludes(j)</code></td>
173<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
174<td align="left">return true if interval i includes interval j</td>
175</tr>
176<tr>
177<td align="left"><code class="computeroutput">i.includes(t)</code></td>
178<td align="left"><code class="computeroutput">bool</code></td>
179<td align="left">return true if interval i includes value t</td>
180</tr>
181<tr>
182<td align="left"><code class="computeroutput">i.excludes(t)</code></td>
183<td align="left"><code class="computeroutput">bool</code></td>
184<td align="left">return true if interval i includes value t</td>
185</tr>
186<tr>
187<td align="left"><code class="computeroutput">i + j</code></td>
188<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
189<td align="left">add two intervals and return the result</td>
190</tr>
191<tr>
192<td align="left"><code class="computeroutput">i - j</code></td>
193<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
194<td align="left">subtract two intervals and return the result</td>
195</tr>
196<tr>
197<td align="left"><code class="computeroutput">i * j</code></td>
198<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
199<td align="left">multiply two intervals and return the result</td>
200</tr>
201<tr>
202<td align="left"><code class="computeroutput">i / j</code></td>
203<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
204<td align="left">divide one interval by another and return the
205              result</td>
206</tr>
207<tr>
208<td align="left"><code class="computeroutput">i % j</code></td>
209<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
210<td align="left">calculate modulus of one interval by another and return
211              the result</td>
212</tr>
213<tr>
214<td align="left"><code class="computeroutput">i &lt;&lt; j</code></td>
215<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
216<td align="left">calculate the range that would result from shifting one
217              interval by another</td>
218</tr>
219<tr>
220<td align="left"><code class="computeroutput">i &gt;&gt; j</code></td>
221<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
222<td align="left">calculate the range that would result from shifting one
223              interval by another</td>
224</tr>
225<tr>
226<td align="left"><code class="computeroutput">i | j</code></td>
227<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
228<td align="left">range of values which can result from applying | to any
229              pair of operands from I and j</td>
230</tr>
231<tr>
232<td align="left"><code class="computeroutput">i &amp; j</code></td>
233<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
234<td align="left">range of values which can result from applying &amp; to
235              any pair of operands from I and j</td>
236</tr>
237<tr>
238<td align="left"><code class="computeroutput">i ^ j</code></td>
239<td align="left"><code class="computeroutput">interval&lt;R&gt;</code></td>
240<td align="left">range of values which can result from applying ^ to any
241              pair of operands from I and j</td>
242</tr>
243<tr>
244<td align="left"><code class="computeroutput">t &lt; u</code></td>
245<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
246<td align="left">true if every element in t is less than every element in
247              u</td>
248</tr>
249<tr>
250<td align="left"><code class="computeroutput">t &gt; u</code></td>
251<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
252<td align="left">true if every element in t is greater than every element
253              in u</td>
254</tr>
255<tr>
256<td align="left"><code class="computeroutput">t &lt;= u</code></td>
257<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
258<td align="left">true if every element in t is less than or equal to every
259              element in u</td>
260</tr>
261<tr>
262<td align="left"><code class="computeroutput">t &gt;= u</code></td>
263<td align="left"><code class="computeroutput">boost::logic::tribool</code></td>
264<td align="left">true if every element in t is greater than or equal to
265              every element in u</td>
266</tr>
267<tr>
268<td align="left"><code class="computeroutput">t == u</code></td>
269<td align="left"><code class="computeroutput">bool</code></td>
270<td align="left">true if limits are equal</td>
271</tr>
272<tr>
273<td align="left"><code class="computeroutput">t != u</code></td>
274<td align="left"><code class="computeroutput">bool</code></td>
275<td align="left">true if limits are not equal</td>
276</tr>
277<tr>
278<td align="left"><code class="computeroutput">os &lt;&lt; i</code></td>
279<td align="left"><code class="computeroutput">os &amp;</code></td>
280<td align="left">print interval to output stream</td>
281</tr>
282</tbody>
283</table></div>
284</div>
285<div class="section">
286<div class="titlepage"><div><div><h4 class="title">
287<a name="idm130202023104"></a>Example of use</h4></div></div></div>
288<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
289<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cstdint</span><span class="special">&gt;</span>
290<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
291<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">numeric</span><span class="special">/</span><span class="identifier">safe_numerics</span><span class="special">/</span><span class="identifier">interval</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
292
293<span class="keyword">int</span> <span class="identifier">main</span><span class="special">(</span><span class="special">)</span><span class="special">{</span>
294    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"test1"</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>
295    <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span> <span class="identifier">x</span> <span class="special">=</span> <span class="special">{</span><span class="special">-</span><span class="number">64</span><span class="special">,</span> <span class="number">63</span><span class="special">}</span><span class="special">;</span>
296    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</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>
297    <span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span> <span class="identifier">y</span><span class="special">(</span><span class="special">-</span><span class="number">128</span><span class="special">,</span> <span class="number">126</span><span class="special">)</span><span class="special">;</span>
298    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"y = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">y</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>
299    <span class="identifier">assert</span><span class="special">(</span><span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">interval</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;&gt;</span><span class="special">(</span><span class="identifier">add</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span><span class="identifier">x</span><span class="special">)</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">)</span><span class="special">;</span>
300    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x + x ="</span> <span class="special">&lt;&lt;</span> <span class="identifier">add</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">x</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>
301    <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"x - x = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">subtract</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">int16_t</span><span class="special">&gt;</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">x</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>
302    <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
303<span class="special">}</span></pre>
304</div>
305<div class="section">
306<div class="titlepage"><div><div><h4 class="title">
307<a name="idm130201930272"></a>Header</h4></div></div></div>
308<p><code class="computeroutput">#include
309    &lt;boost/numeric/safe_numerics/interval.hpp&gt;</code></p>
310</div>
311</div>
312<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
313<td align="left"></td>
314<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
315      Software License</a></p>
316</div></td>
317</tr></table>
318<hr>
319<div class="spirit-nav">
320<a accesskey="p" href="checked_arithmetic.html"><img src="images/prev.png" alt="Prev"></a><a accesskey="u" href="library_implementation.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="checked_integer_arithmetic.html"><img src="images/next.png" alt="Next"></a>
321</div>
322</body>
323</html>
324