24 #ifndef GUL14_BIT_MANIP_H_
25 #define GUL14_BIT_MANIP_H_
28 #include <type_traits>
55 std::is_integral<T>::value
56 and not std::is_same<std::decay_t<T>,
bool>::value,
81 #if defined(__BYTE_ORDER__)
82 little = __ORDER_LITTLE_ENDIAN__,
83 big = __ORDER_BIG_ENDIAN__,
85 #elif defined(_MSC_VER) && !defined(__clang__)
90 #error "Don't know how to determine machine endianness on this compiler"
120 template <
typename T =
unsigned,
typename ReturnT = BitFunctionReturnType<T>>
121 auto constexpr
inline bit_set(
unsigned bit) noexcept -> ReturnT {
122 assert(bit <
sizeof(T) * 8);
123 return static_cast<ReturnT
>(std::make_unsigned_t<T>{1u} << bit);
146 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
147 auto constexpr
inline bit_set(T previous,
unsigned bit) noexcept -> ReturnT {
148 return previous | bit_set<T>(bit);
171 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
172 auto constexpr
inline bit_reset(T previous,
unsigned bit) noexcept -> ReturnT {
173 return static_cast<ReturnT
>(previous & ~bit_set<T>(bit));
198 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
199 auto constexpr
inline bit_flip(T previous,
unsigned bit) noexcept -> ReturnT {
200 return previous ^ bit_set<T>(bit);
223 template <
typename T>
224 bool constexpr
inline bit_test(T bits,
unsigned bit) noexcept {
225 return bits & bit_set<T>(bit);
endian
An enum to determine the endianness of multi-byte scalars on the current platform.
Definition: bit_manip.h:80
constexpr bool is_little_endian()
Determine whether this platform uses little-endian (Intel) order for storing multi-byte quantities in...
Definition: bit_manip.h:253
constexpr auto bit_set(unsigned bit) noexcept -> ReturnT
Set a bit in an integral type.
Definition: bit_manip.h:121
constexpr auto bit_flip(T previous, unsigned bit) noexcept -> ReturnT
Flip a bit in an integral value.
Definition: bit_manip.h:199
constexpr bool bit_test(T bits, unsigned bit) noexcept
Test a bit in an integral value.
Definition: bit_manip.h:224
constexpr auto bit_reset(T previous, unsigned bit) noexcept -> ReturnT
Reset a bit in an integral value.
Definition: bit_manip.h:172
constexpr bool is_big_endian()
Determine whether this platform uses big-endian (Motorola) order for storing multi-byte quantities in...
Definition: bit_manip.h:238
std::enable_if_t< std::is_integral< T >::value and not std::is_same< std::decay_t< T >, bool >::value, std::decay_t< T > > BitFunctionReturnType
Return type of the bit manipulation functions.
Definition: bit_manip.h:58
@ native
Native endianness.
@ little
Little-endian (e.g. Intel)
@ big
Big-endian (e.g. Motorola)
Definition of macros used internally by GUL.
Namespace gul14 contains all functions and classes of the General Utility Library.
Definition: doxygen.h:26