| ## Safe Numerics

### Integer<T>

#### Description

A type fulfills the requirements of an Integer if it has the properties of a integer.

More specifically, a type T is Integer if there exists a specialization of `std::numeric_limits<T> for which std::numeric_limits<T>::is_integer` is equal to `true`. See the documentation for standard library class `numeric_limits`. The standard library includes such specializations for all built-in numeric types. Note that this concept is distinct from the C++ standard library type traits `is_integral` and `is_arithmetic`. These latter fulfill the requirements of the concept Numeric. But there are types which fulfill this concept for which `is_arithmetic<T>::value == false`. For example see `safe<int>`.

#### Refinement of

Numeric

#### Notation

`T, U, V` | A type that is a model of an Integer type
`t, u` | An object of type modeling an Integer type
`OS, IS` | A type that is a model of an output or input stream
`os, is` | An object of a type modeling output or input stream

#### Valid Expressions

In addition to the expressions defined in Integer, the following expression must be true.

Table 4. General

Expression | Value
--- | ---
`std::numeric_limits<T>::is_integer` | true

Any or all of the following unary operators MAY be defined. Any such defined operators shall implement the semantics as described below

Table 5. Unary Operator

Expression | Return Type | Semantics
--- | --- | ---
`~t` | `T` | bitwise complement

Any or all of the following binary operators MAY be defined. Any defined operators shall implement the semantics as described bellow

Table 6. Binary Operators

Expression | Return Type | Semantics
--- | --- | ---
`t % u` | `T` | t modulus u. t can be a Numeric type.
`t << u` | `T` | shift t left u bits
`t >> u` | `T` | shift t right by u bits
`t & u` | `V` | and of t and u padded out to max # bits in t, u
`t | u` | `V` | or of t and u padded out to max # bits in t, u
`t ^ u` | `V` | exclusive or of t and u padded out to max # bits in t, u
`t <<= u` | `T` | left shift the value of t by u bits
`t >>= u` | `T` | right shift the value of t by u bits
`t &= u` | `T` | and the value of t with u and assign to t
`t |= u` | `T` | or the value of t with u and assign to t
`t ^= u` | `T` | exclusive or the value of t with u and assign to t
`os << t` | ``OS &`` | write contents of t to output stream
`is >> t` | ``IS &`` | read contents of an input stream into t

#### Models

`int, safe<int>, safe_unsigned_range<0, 11>, checked_result<int> etc.`

#### Header

`#include <boost/safe_numerics/concepts/integer.hpp>`