24#ifndef JAU_BITFIELD_HPP_
25#define JAU_BITFIELD_HPP_
40 template <
size_t BitSize>
49 typedef std::array<uint32_t, storage_size> storage_t;
52 static constexpr bool in_range(
size_t bit_size_,
size_t bitnum) {
return bitnum < bit_size_; }
55 static constexpr uint32_t bit_mask(
size_t n)
noexcept {
57 return ( 1 << n ) - 1;
59 return std::numeric_limits<uint32_t>::max();
71 constexpr void clear() noexcept {
72 for(
size_t i=0; i<storage_size; ++i) {
78 constexpr bool get(
size_t bitnum)
const noexcept {
79 if( !in_range(bitnum) ) {
84 return 0 != ( storage[u] & ( 1U << b ) ) ;
87 constexpr void put(
size_t bitnum,
bool v)
noexcept {
88 if( !in_range(bitnum) ) {
93 const uint32_t m = 1 << b;
101 constexpr void set(
size_t bitnum)
noexcept {
put(bitnum,
true); }
103 constexpr void clr(
size_t bitnum)
noexcept {
put(bitnum,
false); }
106 bool copy(
size_t srcBitnum,
size_t dstBitnum)
noexcept {
107 const bool bit =
get(srcBitnum);
113 uint32_t
getu32(
size_t lowBitnum,
size_t length)
const noexcept {
121 const uint32_t m = bit_mask(length);
122 return m & storage[u];
125 const size_t l1 = std::min(length, left);
126 const uint32_t
m1 = ( 1 << l1 ) - 1;
127 const uint32_t d1 =
m1 & ( storage[u] >> lowBitnum );
128 const size_t l2 = length - l1;
130 const uint32_t
m2 = ( 1 << l2 ) - 1;
131 return d1 | ( (
m2 & storage[u+1] ) << l1 );
139 void putu32(
size_t lowBitnum,
size_t length, uint32_t data)
noexcept {
147 const uint32_t m = bit_mask(length);
148 storage[u] = ( ( ~m ) & storage[u] )
152 const size_t l1 = std::min(length, left);
153 const uint32_t
m1 = ( 1 << l1 ) - 1;
154 storage[u] = ( (~(
m1 << lowBitnum ) ) & storage[u])
155 | ( (
m1 & data ) << lowBitnum);
156 const size_t l2 = length - l1;
158 const uint32_t
m2 = ( 1 << l2 ) - 1;
159 storage[u+1] = ( (
~m2 ) & storage[u+1] )
160 | (
m2 & ( data >> l1 ) );
166 uint32_t
copyu32(
size_t srcBitnum,
size_t dstBitnum,
size_t length)
noexcept {
167 const uint32_t data =
getu32(srcBitnum, length);
168 putu32(dstBitnum, length, data);
175 for(
size_t i=0; i<storage_size; ++i) {
constexpr void put(size_t bitnum, bool v) noexcept
uint32_t getu32(size_t lowBitnum, size_t length) const noexcept
static constexpr size_t unit_shift
size_t bitCount() const noexcept
constexpr void clr(size_t bitnum) noexcept
constexpr bool get(size_t bitnum) const noexcept
static constexpr size_t bit_size
static constexpr size_t unit_bit_size
constexpr bitfield() noexcept
void putu32(size_t lowBitnum, size_t length, uint32_t data) noexcept
static constexpr bool in_range(size_t bitnum)
uint32_t copyu32(size_t srcBitnum, size_t dstBitnum, size_t length) noexcept
bool copy(size_t srcBitnum, size_t dstBitnum) noexcept
constexpr void set(size_t bitnum) noexcept
constexpr void clear() noexcept
constexpr uint32_t ct_bit_count(uint32_t n) noexcept
Returns the number of set bits within given 32bit integer (w/o branching) in O(1) and constant time (...
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.
static const Mat4f m1(m1_0)
static const Mat4f m2(m2_0)