2#include <NDEVR/Buffer.h>
21 : m_bits_per_element(bits_per_element)
23 lib_assert(bits_per_element != 0 && bits_per_element < 64,
"Bad Bit Alignment");
41 lib_assert(data && byteCount > 0,
"Invalid input data");
44 uint04 word_count = (byteCount + 7) / 8;
45 storage.setSize(word_count, 0);
48 for (
uint04 i = 0; i < byteCount; ++i)
51 uint04 byte_offset = i % 8;
52 storage[wordIndex] |=
static_cast<uint08>(data[i]) << (byte_offset * 8);
56 uint04 total_bits = byteCount * 8;
57 m_size = total_bits / m_bits_per_element;;
65 lib_assert(value < (1ULL << m_bits_per_element),
"value too large");
68 uint04 bitPos = m_size * m_bits_per_element;
69 uint04 wordIndex = bitPos / 64;
70 uint04 bitOffset = bitPos % 64;
73 storage[wordIndex] &= ~(((1ULL << m_bits_per_element) - 1) << bitOffset);
75 storage[wordIndex] |= (value << bitOffset);
78 if (bitOffset + m_bits_per_element > 64) {
79 uint08 spillBits = (bitOffset + m_bits_per_element) - 64;
80 storage[wordIndex + 1] &= ~((1ULL << spillBits) - 1);
81 storage[wordIndex + 1] |= (value >> (m_bits_per_element - spillBits));
93 lib_assert(bit_pos < m_size * m_bits_per_element,
"Index out of range");
94 uint04 word_index = bit_pos / 64;
95 uint04 bit_offset = bit_pos % 64;
96 uint04 and_value = ((1ULL << m_bits_per_element) - 1);
97 uint08 value = (storage[word_index] >> bit_offset) & and_value;
100 if (bit_offset + m_bits_per_element > 64)
102 uint08 spillBits = (bit_offset + m_bits_per_element) - 64;
103 uint08 nextBits = storage[word_index + 1] & ((1ULL << spillBits) - 1);
104 value |= (nextBits << (m_bits_per_element - spillBits));
124 lib_assert(index < m_size,
"Index out of range");
135 lib_assert(index < m_size,
"Index out of range");
136 lib_assert(value < (1ULL << m_bits_per_element),
"Value exceeds bit limit");
138 uint04 bitPos = index * m_bits_per_element;
139 uint04 wordIndex = bitPos / 64;
140 uint04 bitOffset = bitPos % 64;
143 storage[wordIndex] &= ~(((1ULL << m_bits_per_element) - 1) << bitOffset);
145 storage[wordIndex] |= (value << bitOffset);
148 if (bitOffset + m_bits_per_element > 64) {
149 uint08 spillBits = (bitOffset + m_bits_per_element) - 64;
150 storage[wordIndex + 1] &= ~((1ULL << spillBits) - 1);
151 storage[wordIndex + 1] |= (value >> (m_bits_per_element - spillBits));
160 return m_bits_per_element;
176 uint04 totalBits = newSize * m_bits_per_element;
177 uint04 requiredWords = (totalBits + 63) / 64;
178 if (storage.size() < requiredWords)
180 storage.setSize(requiredWords, 0U);
184 uint04 m_bits_per_element;
uint08 operator[](uint04 index) const
Accesses the element at the given index (read-only).
uint04 size() const
Returns the number of elements currently stored in the buffer.
uint08 getValueAtBitOffset(uint04 bit_pos) const
Retrieves the value stored at a specific bit offset within the buffer.
void loadFromBytes(const uint8_t *data, uint04 byteCount)
Loads raw byte data into the buffer, replacing existing contents.
uint04 bitSize() const
Returns the number of bits used per element.
void clear()
Removes all elements and frees storage.
void ensureCapacity(uint04 newSize)
Ensures the internal storage can hold at least the specified number of elements.
void add(uint08 value)
Appends a value to the end of the buffer.
void set(uint04 index, uint08 value)
Sets the value of the element at the given index.
BitAlignedBuffer(uint04 bits_per_element)
Constructs a BitAlignedBuffer with the specified number of bits per element.
void setSize(uint04 size)
Sets the number of elements in the buffer, allocating storage as needed.
The equivelent of std::vector but with a bit more control.
The primary namespace for the NDEVR SDK.
uint64_t uint08
-Defines an alias representing an 8 byte, unsigned integer
uint32_t uint04
-Defines an alias representing a 4 byte, unsigned integer -Can represent exact integer values 0 throu...