General Utility Library for C++17 25.4.1
bit_manip.h
Go to the documentation of this file.
1
24#ifndef GUL17_BIT_MANIP_H_
25#define GUL17_BIT_MANIP_H_
26
27#include <cassert>
28#include <type_traits>
29
30#include "gul17/internal.h"
31
32namespace gul17 {
33
52template <typename T>
54 std::enable_if_t<
55 std::is_integral<T>::value
56 and not std::is_same<std::decay_t<T>, bool>::value,
57 std::decay_t<T>
58 >;
59
79enum class endian
80{
81#if defined(__BYTE_ORDER__)
82 little = __ORDER_LITTLE_ENDIAN__,
83 big = __ORDER_BIG_ENDIAN__,
84 native = __BYTE_ORDER__
85#elif defined(_MSC_VER) && !defined(__clang__)
86 little = 0,
87 big = 1,
89#else
90 #error "Don't know how to determine machine endianness on this compiler"
91 // Just for Doxygen:
92 little,
93 big,
94 native
95#endif
96};
97
120template <typename T = unsigned, typename ReturnT = BitFunctionReturnType<T>>
121auto 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);
124}
125
146template <typename T, typename ReturnT = BitFunctionReturnType<T>>
147auto constexpr inline bit_set(T previous, unsigned bit) noexcept -> ReturnT {
148 return previous | bit_set<T>(bit);
149}
150
171template <typename T, typename ReturnT = BitFunctionReturnType<T>>
172auto constexpr inline bit_reset(T previous, unsigned bit) noexcept -> ReturnT {
173 return static_cast<ReturnT>(previous & ~bit_set<T>(bit));
174}
175
198template <typename T, typename ReturnT = BitFunctionReturnType<T>>
199auto constexpr inline bit_flip(T previous, unsigned bit) noexcept -> ReturnT {
200 return previous ^ bit_set<T>(bit);
201}
202
223template <typename T>
224bool constexpr inline bit_test(T bits, unsigned bit) noexcept {
225 return bits & bit_set<T>(bit);
226}
227
238constexpr bool is_big_endian()
239{
240 return endian::native == endian::big;
241}
242
253constexpr bool is_little_endian()
254{
256}
257
259
260} // namespace gul17
261
262#endif
263
264// vi:ts=4:sw=4:et
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
auto constexpr bit_set(unsigned bit) noexcept -> ReturnT
Set a bit in an integral type.
Definition bit_manip.h:121
bool constexpr bit_test(T bits, unsigned bit) noexcept
Test a bit in an integral value.
Definition bit_manip.h:224
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
endian
An enum to determine the endianness of multi-byte scalars on the current platform.
Definition bit_manip.h:80
auto constexpr bit_flip(T previous, unsigned bit) noexcept -> ReturnT
Flip a bit in an integral value.
Definition bit_manip.h:199
auto constexpr bit_reset(T previous, unsigned bit) noexcept -> ReturnT
Reset a bit in an integral value.
Definition bit_manip.h:172
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 gul17 contains all functions and classes of the General Utility Library.
Definition doxygen.h:26