Phi
|
A type safe integer class. More...
#include <integer.hpp>
Public Types | |
using | this_type = integer< IntegerT > |
using | value_type = IntegerT |
using | limits_type = std::numeric_limits< IntegerT > |
Public Member Functions | |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_CONSTEXPR | integer (const TypeT &val) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_CONSTEXPR | integer (const integer< TypeT > &val) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_CONSTEXPR | integer (TypeT)=delete |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator= (const TypeT &val) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator= (const integer< TypeT > &val) PHI_NOEXCEPT |
PHI_NODISCARD PHI_ALWAYS_INLINE PHI_CONSTEXPR | operator IntegerT () const PHI_NOEXCEPT |
PHI_NODISCARD PHI_ALWAYS_INLINE PHI_CONSTEXPR IntegerT | unsafe () const PHI_NOEXCEPT |
PHI_EXTENDED_CONSTEXPR void | swap (integer< IntegerT > &other) PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_CONSTEXPR integer | operator+ () const PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer | operator- () const PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator++ () PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR const integer | operator++ (int) PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator-- () PHI_NOEXCEPT |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR const integer | operator-- (int) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator+= (const integer< TypeT > &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator+= (const TypeT &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator+= (integer< TypeT >)=delete |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator+= (TypeT)=delete |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator-= (const integer< TypeT > &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator-= (const TypeT &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator-= (integer< TypeT >)=delete |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator-= (TypeT)=delete |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator*= (const integer< TypeT > &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator*= (const TypeT &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator*= (integer< TypeT >)=delete |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator*= (TypeT)=delete |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator/= (const integer< TypeT > &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator/= (const TypeT &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator/= (integer< TypeT >)=delete |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator/= (TypeT)=delete |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator%= (const integer< TypeT > &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::enable_safe_integer_conversion<TypeT, IntegerT>> | |
PHI_ALWAYS_INLINE PHI_EXTENDED_CONSTEXPR integer & | operator%= (const TypeT &other) PHI_NOEXCEPT |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator%= (integer< TypeT >)=delete |
template<typename TypeT , typename = detail::fallback_safe_integer_conversion<TypeT, IntegerT>> | |
integer & | operator%= (TypeT)=delete |
Static Public Member Functions | |
PHI_NODISCARD PHI_ALWAYS_INLINE static PHI_CONSTEXPR integer< IntegerT > | min () PHI_NOEXCEPT |
PHI_NODISCARD PHI_ALWAYS_INLINE static PHI_CONSTEXPR integer< IntegerT > | max () PHI_NOEXCEPT |
A type safe integer class.
This is a tiny, no overhead wrapper over a standard integer type. It behaves exactly like the built-in types except that narrowing conversions are not allowed. It also checks against unsigned
under/overflow in debug mode and marks it as undefined for the optimizer otherwise.
A conversion is considered safe if both integer types have the same signedness and the size of the value being converted is less than or equal to the destination size.
IntegerT
must be an integral type except bool
and char
(use signed char
/unsigned char
). It intentionally does not provide the bitwise operations. types