It turned out that signed integer division and sign extension is harder to get right than I naïvely thought. However, more test cases helped to figure out the corner cases either not covered, or causing UB. If you are already using this library, please update!
A C++20 implementation of safe (wrap around) integers following MISRA C++ rules.
An #ifdef
ed C++17 implementation is available in branch C++17.
It provides the following types in namspace psssint
and corresponding UDL operators in namespace psssint::literals
:
// unsigned enum class ui8; auto a = 1_ui8; enum class ui16; auto b = 2_ui16; enum class ui32; auto c = 3_ui32; enum class ui64; auto d = 4_ui64; // signed enum class si8; auto e = 5_si8; enum class si16; auto f = 6_si16; enum class si32; auto g = 7_si32; enum class si64; auto h = 8_si64;
You can play around with it on compiler explorer starting here
Some extra features:
ui8
and si8
as integer values.to_int(val)
promotes the safe integer val to built-in integer keeping its signednessto_underlying(val)
allows access to the underlying-type's value, use with care in operations because of promotion. This is useful for existing function overloads.from_int(val)
converts one of the allowed integer type's value to corresponding safe integer type. This is useful for integration with not-yet adapted code. Prevents conversion from char
and bool
, Note that depending on the definition of the types in <cstdint>
not all built-in integer types will convert, for example, if std::int32_t
is defined as int
and std::int64_t
is defined as long long
, you cannot convert a 42L
, because its conversion rank differs from both.from_int_to<safeinttype>(val)
converts integer to safe integer type with range check (throws if mismatch).The following MISRA C++ recommendations for integer usage are implemented:
<=>
in 20)What else do you want?
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4