21inline constexpr uint8_t
bitMaskTable[8] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000};
26inline constexpr uint8_t
bitNotMaskTable[8] = {0b11111110, 0b11111101, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b01111111};
40__JAFFAR_COMMON_INLINE__
void bitcopy(
void* dstBufferPtr,
const size_t dstBufferSize,
const size_t dstBufferOffset,
const void* srcBufferPtr,
const size_t srcBufferSize,
41 const size_t srcBufferOffset,
const size_t count,
const size_t elementBitSize)
43 if (elementBitSize == 0)
JAFFAR_THROW_LOGIC(
"Element bit size must be a positive number greater than zero");
45 const auto dstBufferSizeBits = dstBufferSize * 8;
46 const auto srcBufferSizeBits = srcBufferSize * 8;
50 const size_t totalBitCount = count * elementBitSize;
51 const size_t dstOffsetBits = dstBufferOffset * elementBitSize;
52 const size_t srcOffsetBits = srcBufferOffset * elementBitSize;
54 if (dstOffsetBits + totalBitCount > dstBufferSizeBits)
55 JAFFAR_THROW_LOGIC(
"The operation will overflow destination buffer (%lu + %lu > %lu)", dstOffsetBits, totalBitCount, dstBufferSizeBits);
56 if (srcOffsetBits + totalBitCount > srcBufferSizeBits)
57 JAFFAR_THROW_LOGIC(
"The operation will overflow source buffer (%lu + %lu > %lu)", srcOffsetBits, totalBitCount, srcBufferSizeBits);
59 uint8_t* dstBuffer = (uint8_t*)dstBufferPtr;
60 const uint8_t* srcBuffer = (
const uint8_t*)srcBufferPtr;
61 size_t dstPosByte = dstOffsetBits / 8;
62 uint8_t dstPosBit = dstOffsetBits % 8;
63 size_t srcPosByte = srcOffsetBits / 8;
64 uint8_t srcPosBit = srcOffsetBits % 8;
66 for (
size_t i = 0; i < totalBitCount; i++)
69 dstBuffer[dstPosByte] = dstBuffer[dstPosByte] &
bitNotMaskTable[dstPosBit];
72 if ((srcBuffer[srcPosByte] &
bitMaskTable[srcPosBit]) > 0) dstBuffer[dstPosByte] = dstBuffer[dstPosByte] |
bitMaskTable[dstPosBit];
102 if (elementCount == 0)
return 0;
103 if (elementCount == 1)
return 1;
106 size_t bitEncodingSize = 0;
107 size_t encodingCapacity = 1;
108 while (encodingCapacity < elementCount) { encodingCapacity <<= 1, bitEncodingSize++; };
109 return bitEncodingSize;
121 size_t byteStorageSize = bitCount / 8;
122 if (bitCount % 8 > 0) byteStorageSize++;
123 return byteStorageSize;
133__JAFFAR_COMMON_INLINE__
void setBitValue(
void* dst,
const size_t idx,
const bool value)
135 size_t dstPosByte = idx / 8;
136 uint8_t dstPosBit = idx % 8;
137 auto dstPtr = (uint8_t*)dst;
139 if (value ==
false) dstPtr[dstPosByte] = dstPtr[dstPosByte] &
bitNotMaskTable[dstPosBit];
140 if (value ==
true) dstPtr[dstPosByte] = dstPtr[dstPosByte] |
bitMaskTable[dstPosBit];
150__JAFFAR_COMMON_INLINE__
bool getBitValue(
const void* src,
const size_t idx)
152 size_t srcPosByte = idx / 8;
153 uint8_t srcPosBit = idx % 8;
154 auto srcPtr = (
const uint8_t*)src;
156 return (srcPtr[srcPosByte] &
bitMaskTable[srcPosBit]) > 0;
166__JAFFAR_COMMON_INLINE__
bool getBitFlag(
const uint8_t value,
const uint8_t idx)
168 if (idx > 7)
JAFFAR_THROW_LOGIC(
"Provided bit index higher than 7 for a an 8-bit value");
170 if (((idx == 7) && (value & 0b10000000)) || ((idx == 6) && (value & 0b01000000)) || ((idx == 5) && (value & 0b00100000)) || ((idx == 4) && (value & 0b00010000)) ||
171 ((idx == 3) && (value & 0b00001000)) || ((idx == 2) && (value & 0b00000100)) || ((idx == 1) && (value & 0b00000010)) || ((idx == 0) && (value & 0b00000001)))
constexpr uint8_t bitMaskTable[8]
Definition bitwise.hpp:21
__JAFFAR_COMMON_INLINE__ bool getBitFlag(const uint8_t value, const uint8_t idx)
Definition bitwise.hpp:166
__JAFFAR_COMMON_INLINE__ void setBitValue(void *dst, const size_t idx, const bool value)
Definition bitwise.hpp:133
__JAFFAR_COMMON_INLINE__ void bitcopy(void *dstBufferPtr, const size_t dstBufferSize, const size_t dstBufferOffset, const void *srcBufferPtr, const size_t srcBufferSize, const size_t srcBufferOffset, const size_t count, const size_t elementBitSize)
Definition bitwise.hpp:40
__JAFFAR_COMMON_INLINE__ bool getBitValue(const void *src, const size_t idx)
Definition bitwise.hpp:150
__JAFFAR_COMMON_INLINE__ size_t getEncodingBitsForElementCount(const size_t elementCount)
Definition bitwise.hpp:99
constexpr uint8_t bitNotMaskTable[8]
Definition bitwise.hpp:26
__JAFFAR_COMMON_INLINE__ size_t getByteStorageForBitCount(const size_t bitCount)
Definition bitwise.hpp:118
Contains common functions for exception throwing.
#define JAFFAR_THROW_LOGIC(...)
Definition exceptions.hpp:27