...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

## Safe Numerics |

A closed arithmetic interval represented by a pair of elements of
type R. In principle, one should be able to use Boost.Interval library for
this. But the functions in this library are not `constexpr`

.
Also, this Boost.Interval is more complex and does not support certain
operations such bit operations. Perhaps some time in the future,
Boost.Interval will be used instead of this `interval<R>`

type.

R must model the type requirements of Numeric. Note this in principle
includes any numeric type including floating point numbers and instances
of `checked_result<R>`

.

Symbol | Description |
---|---|

`I` |
An interval type |

`i, j` |
An instance of interval type |

`R` |
Numeric types which can be used to make an interval |

`r` |
An instance of type R |

`p` |
An instance of std::pair<R, R> |

`l, u` |
Lowermost and uppermost values in an interval |

`os` |
std::basic_ostream<class CharT, class Traits = std::char_traits<CharT>> |

`checked_result` |
holds either the result of an operation or information as to why it failed |

Note that all expressions are constexpr.

Expression | Return Type | Semantics |
---|---|---|

`interval<R>(l, u)` |
`interval<R>` |
construct a new interval from a pair of limits |

`interval<R>(p)` |
`interval<R>` |
construct a new interval from a pair of limits |

`interval<R>(i)` |
`interval<R>` |
copy constructor |

`make_interval<R>()` |
`interval<R>` |
return new interval with std::numric_limits<R>::min() and std::numric_limits<R>::max() |

```
make_interval<R>(const R
&r)
``` |
`interval<R>` |
return new interval with std::numric_limits<R>::min() and std::numric_limits<R>::max() |

`i.l` |
`R` |
lowermost value in the interval i |

`i.u` |
`R` |
uppermost value in the interval i |

`i.includes(j)` |
`boost::logic::tribool` |
return true if interval i includes interval j |

`i.excludes(j)` |
`boost::logic::tribool` |
return true if interval i includes interval j |

`i.includes(t)` |
`bool` |
return true if interval i includes value t |

`i.excludes(t)` |
`bool` |
return true if interval i includes value t |

`i + j` |
`interval<R>` |
add two intervals and return the result |

`i - j` |
`interval<R>` |
subtract two intervals and return the result |

`i * j` |
`interval<R>` |
multiply two intervals and return the result |

`i / j` |
`interval<R>` |
divide one interval by another and return the result |

`i % j` |
`interval<R>` |
calculate modulus of one interval by another and return the result |

`i << j` |
`interval<R>` |
calculate the range that would result from shifting one interval by another |

`i >> j` |
`interval<R>` |
calculate the range that would result from shifting one interval by another |

`i | j` |
`interval<R>` |
range of values which can result from applying | to any pair of operands from I and j |

`i & j` |
`interval<R>` |
range of values which can result from applying & to any pair of operands from I and j |

`i ^ j` |
`interval<R>` |
range of values which can result from applying ^ to any pair of operands from I and j |

`t < u` |
`boost::logic::tribool` |
true if every element in t is less than every element in u |

`t > u` |
`boost::logic::tribool` |
true if every element in t is greater than every element in u |

`t <= u` |
`boost::logic::tribool` |
true if every element in t is less than or equal to every element in u |

`t >= u` |
`boost::logic::tribool` |
true if every element in t is greater than or equal to every element in u |

`t == u` |
`bool` |
true if limits are equal |

`t != u` |
`bool` |
true if limits are not equal |

`os << i` |
`os &` |
print interval to output stream |

#include <iostream> #include <cstdint> #include <cassert> #include <boost/numeric/safe_numerics/interval.hpp> int main(){ std::cout << "test1" << std::endl; interval<std::int16_t> x = {-64, 63}; std::cout << "x = " << x << std::endl; interval<std::int16_t> y(-128, 126); std::cout << "y = " << y << std::endl; assert(static_cast<interval<std::int16_t>>(add<std::int16_t>(x,x)) == y); std::cout << "x + x =" << add<std::int16_t>(x, x) << std::endl; std::cout << "x - x = " << subtract<std::int16_t>(x, x) << std::endl; return 0; }