# safe_signed_range<MIN, MAX, PP, EP> and safe_unsigned_range<MIN, MAX, PP, EP>

## Description

This type holds a signed or unsigned integer in the closed range [MIN, MAX]. A `safe_signed_range<MIN, MAX, PP, EP>` or `safe_unsigned_range<MIN, MAX, PP, EP>` can be used anywhere an arithmetic type is permitted. Any expression which uses either of these types is guaranteed to return an arithmetically correct value or to trap in some way.

## Notation

Symbol | Description
--- | ---
`MIN, MAX` | Minimum and maximum values that the range can represent.

## Associated Types

`PP` | Promotion Policy. A type which specifies the result type of an expression using safe types.
`EP` | Exception Policy. A type containing members which are called when a correct result cannot be returned

## Template Parameters

Parameter | Requirements | Description
--- | --- | ---
`T` | std::is_integer<T> | The underlying type. Currently only built-in integer types are supported
`MIN` | must be a non-negative literal | The minimum non-negative integer value that this type may hold
`MAX` | must be a non-negative literal | The maximum non-negative integer value that this type may hold
| MIN <= MAX | must be a valid closed range
`PP` | PromotionPolicy<PP> | Default value is `boost::numeric::native`
`EP` | Exception Policy<EP> | Default value is `boost::numeric::default_exception_policy`

## Model of

Numeric

Integer

## Valid Expressions

Implements all expressions and only those expressions supported by the base type T. Note that all these expressions are `constexpr`. The result type of such an expression will be another safe type. The actual type of the result of such an expression will depend upon the specific promotion policy template parameter.

When a binary operand is applied to two instances of A `safe_signed_range<MIN, MAX, PP, EP>` or `safe_unsigned_range<MIN, MAX, PP, EP>` one of the following must be true:

- The promotion policies of the two operands must be the same or one of them must be void

- The exception policies of the two operands must be the same or one of them must be void

If either of the above is not true, a compile error will result.

## Example of use

## Header

`#include <boost/numeric/safe_numerics/safe_range.hpp>`