24 #ifndef GUL14_BIT_MANIP_H_
25 #define GUL14_BIT_MANIP_H_
28 #include <type_traits>
49 std::is_integral<T>::value
50 and not std::is_same<std::decay_t<T>,
bool>::value,
76 template <
typename T =
unsigned,
typename ReturnT = BitFunctionReturnType<T>>
77 auto constexpr
inline bit_set(
unsigned bit) noexcept -> ReturnT {
78 assert(bit <
sizeof(T) * 8);
79 return static_cast<ReturnT
>(std::make_unsigned_t<T>{1u} << bit);
102 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
103 auto constexpr
inline bit_set(T previous,
unsigned bit) noexcept -> ReturnT {
104 return previous | bit_set<T>(bit);
127 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
128 auto constexpr
inline bit_reset(T previous,
unsigned bit) noexcept -> ReturnT {
129 return static_cast<ReturnT
>(previous & ~bit_set<T>(bit));
154 template <
typename T,
typename ReturnT = BitFunctionReturnType<T>>
155 auto constexpr
inline bit_flip(T previous,
unsigned bit) noexcept -> ReturnT {
156 return previous ^ bit_set<T>(bit);
179 template <
typename T>
180 bool constexpr
inline bit_test(T bits,
unsigned bit) noexcept {
181 return bits & bit_set<T>(bit);
Definition of macros used internally by GUL.
Namespace gul14 contains all functions and classes of the General Utility Library.
Definition: doxygen.h:26
constexpr auto bit_set(unsigned bit) noexcept -> ReturnT
Set a bit in an integral type.
Definition: bit_manip.h:77
constexpr auto bit_flip(T previous, unsigned bit) noexcept -> ReturnT
Flip a bit in an integral value.
Definition: bit_manip.h:155
constexpr bool bit_test(T bits, unsigned bit) noexcept
Test a bit in an integral value.
Definition: bit_manip.h:180
constexpr auto bit_reset(T previous, unsigned bit) noexcept -> ReturnT
Reset a bit in an integral value.
Definition: bit_manip.h:128
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:52