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 operator[](
size_t bitnum)
const noexcept {
return get(bitnum); }
81 constexpr bool get(
size_t bitnum)
const noexcept {
82 if( !in_range(bitnum) ) {
87 return 0 != ( storage[u] & ( 1U << b ) ) ;
90 constexpr void put(
size_t bitnum,
bool v)
noexcept {
91 if( !in_range(bitnum) ) {
96 const uint32_t m = 1 << b;
104 constexpr void set(
size_t bitnum)
noexcept {
put(bitnum,
true); }
106 constexpr void clr(
size_t bitnum)
noexcept {
put(bitnum,
false); }
109 bool copy(
size_t srcBitnum,
size_t dstBitnum)
noexcept {
110 const bool bit =
get(srcBitnum);
116 uint32_t
getu32(
size_t lowBitnum,
size_t length)
const noexcept {
124 const uint32_t m = bit_mask(length);
125 return m & storage[u];
128 const size_t l1 = std::min(length, left);
129 const uint32_t
m1 = ( 1 << l1 ) - 1;
130 const uint32_t d1 =
m1 & ( storage[u] >> lowBitnum );
131 const size_t l2 = length - l1;
133 const uint32_t
m2 = ( 1 << l2 ) - 1;
134 return d1 | ( (
m2 & storage[u+1] ) << l1 );
142 void putu32(
size_t lowBitnum,
size_t length, uint32_t data)
noexcept {
150 const uint32_t m = bit_mask(length);
151 storage[u] = ( ( ~m ) & storage[u] )
155 const size_t l1 = std::min(length, left);
156 const uint32_t
m1 = ( 1 << l1 ) - 1;
157 storage[u] = ( (~(
m1 << lowBitnum ) ) & storage[u])
158 | ( (
m1 & data ) << lowBitnum);
159 const size_t l2 = length - l1;
161 const uint32_t
m2 = ( 1 << l2 ) - 1;
162 storage[u+1] = ( (
~m2 ) & storage[u+1] )
163 | (
m2 & ( data >> l1 ) );
169 uint32_t
copyu32(
size_t srcBitnum,
size_t dstBitnum,
size_t length)
noexcept {
170 const uint32_t data =
getu32(srcBitnum, length);
171 putu32(dstBitnum, length, data);
178 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
constexpr bool operator[](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)