1 #ifndef ZSERIO_BIT_STREAM_WRITER_H_INC
2 #define ZSERIO_BIT_STREAM_WRITER_H_INC
73 template <
typename ALLOC>
238 template <
typename ALLOC>
245 size_t numBytesToWrite = bitSize / 8;
246 const uint8_t numRestBits =
static_cast<uint8_t
>(bitSize - numBytesToWrite * 8);
249 if ((beginBitPosition & 0x07U) != 0)
254 writeUnsignedBits32Impl(*it, 8);
263 (void)std::copy(buffer.
begin(), buffer.
begin() + numBytesToWrite,
264 m_buffer.
data() + beginBitPosition / 8);
270 writeUnsignedBits32Impl(
static_cast<uint32_t
>(*itEnd) >> (8U - numRestBits), numRestBits);
296 void alignTo(
size_t alignment);
305 return m_buffer.
data() !=
nullptr;
329 return m_bufferBitSize;
333 void writeUnsignedBits32Impl(uint32_t data, uint8_t
numBits);
334 void writeUnsignedBits64Impl(uint64_t data, uint8_t
numBits);
335 void writeSignedVarNum(int64_t value,
size_t maxVarBytes,
size_t numVarBytes);
336 void writeUnsignedVarNum(uint64_t value,
size_t maxVarBytes,
size_t numVarBytes);
337 void writeVarNum(uint64_t value,
bool hasSign,
bool isNegative,
size_t maxVarBytes,
size_t numVarBytes);
339 void checkCapacity(
size_t bitSize)
const;
340 void throwInsufficientCapacityException()
const;
344 size_t m_bufferBitSize;
350 inline void write(BitStreamWriter& writer,
Bool value)
352 writer.writeBool(value);
355 template <BitSize BIT_SIZE,
bool IS_SIGNED>
356 void write(BitStreamWriter& writer, FixedIntWrapper<BIT_SIZE, IS_SIGNED> value)
358 using ValueType =
typename FixedIntWrapper<BIT_SIZE, IS_SIGNED>::ValueType;
360 static_assert(BIT_SIZE != 0,
"Variable dynamic bit fields not allowed here!");
361 if constexpr (
sizeof(ValueType) <= 4)
363 if constexpr (std::is_signed_v<ValueType>)
365 writer.writeSignedBits32(value, BIT_SIZE);
369 writer.writeUnsignedBits32(value, BIT_SIZE);
374 if constexpr (std::is_signed_v<ValueType>)
376 writer.writeSignedBits64(value, BIT_SIZE);
380 writer.writeUnsignedBits64(value, BIT_SIZE);
385 template <
typename T>
386 void write(BitStreamWriter& writer, DynIntWrapper<T> value, uint8_t
numBits)
388 if constexpr (
sizeof(T) <= 4)
390 if constexpr (std::is_signed_v<T>)
392 writer.writeSignedBits32(value,
numBits);
396 writer.writeUnsignedBits32(value,
numBits);
401 if constexpr (std::is_signed_v<T>)
403 writer.writeSignedBits64(value,
numBits);
407 writer.writeUnsignedBits64(value,
numBits);
412 inline void write(BitStreamWriter& writer,
VarInt16 value)
414 writer.writeVarInt16(value);
417 inline void write(BitStreamWriter& writer,
VarInt32 value)
419 writer.writeVarInt32(value);
422 inline void write(BitStreamWriter& writer,
VarInt64 value)
424 writer.writeVarInt64(value);
427 inline void write(BitStreamWriter& writer,
VarInt value)
429 writer.writeVarInt(value);
432 inline void write(BitStreamWriter& writer,
VarUInt16 value)
434 writer.writeVarUInt16(value);
437 inline void write(BitStreamWriter& writer,
VarUInt32 value)
439 writer.writeVarUInt32(value);
442 inline void write(BitStreamWriter& writer,
VarUInt64 value)
444 writer.writeVarUInt64(value);
447 inline void write(BitStreamWriter& writer,
VarUInt value)
449 writer.writeVarUInt(value);
452 inline void write(BitStreamWriter& writer,
VarSize value)
454 writer.writeVarSize(value);
457 inline void write(BitStreamWriter& writer,
Float16 value)
459 writer.writeFloat16(value);
462 inline void write(BitStreamWriter& writer,
Float32 value)
464 writer.writeFloat32(value);
467 inline void write(BitStreamWriter& writer,
Float64 value)
469 writer.writeFloat64(value);
472 inline void write(BitStreamWriter& writer,
BytesView value)
474 writer.writeBytes(value);
477 inline void write(BitStreamWriter& writer, std::string_view value)
479 writer.writeString(value);
482 template <
typename ALLOC>
483 inline void write(BitStreamWriter& writer,
const BasicBitBufferView<ALLOC>& value)
485 writer.writeBitBuffer(value.get());
Span< const uint8_t > getData() const
size_t getBitSize() const
~InsufficientCapacityException() override
void writeBool(Bool data)
void writeVarUInt16(VarUInt16 data)
Span< const uint8_t > getBuffer() const
void writeVarInt32(VarInt32 data)
void writeFloat64(Float64 data)
void writeVarUInt64(VarUInt64 data)
~BitStreamWriter()=default
size_t getBufferBitSize() const
BitPosType getBitPosition() const
void writeVarInt16(VarInt16 data)
const uint8_t * getWriteBuffer() const
void writeSignedBits64(int64_t data, uint8_t numBits=64)
BitStreamWriter(const BitStreamWriter &&)=delete
void writeVarInt64(VarInt64 data)
BitStreamWriter(const BitStreamWriter &)=delete
BitStreamWriter & operator=(const BitStreamWriter &)=delete
void writeUnsignedBits32(uint32_t data, uint8_t numBits=32)
void writeFloat32(Float32 data)
void writeSignedBits32(int32_t data, uint8_t numBits=32)
void writeVarUInt(VarUInt data)
void writeBytes(BytesView data)
void writeUnsignedBits64(uint64_t data, uint8_t numBits=64)
void writeBitBuffer(const BasicBitBuffer< ALLOC > &bitBuffer)
BitStreamWriter(BasicBitBuffer< ALLOC > &bitBuffer)
BitStreamWriter(uint8_t *buffer, size_t bufferBitSize, BitsTag)
BitStreamWriter & operator=(BitStreamWriter &&)=delete
void writeString(std::string_view data)
void writeFloat16(Float16 data)
void writeVarUInt32(VarUInt32 data)
void writeVarSize(VarSize data)
bool hasWriteBuffer() const
void writeVarInt(VarInt data)
void setBitPosition(BitPosType position)
void alignTo(size_t alignment)
CppRuntimeException(const char *message="")
constexpr pointer data() const noexcept
constexpr iterator begin() const noexcept
uint8_t numBits(uint64_t numValues)
Span< const uint8_t > BytesView
detail::VarIntWrapper< uint64_t, detail::VarIntType::VAR > VarUInt
detail::FloatWrapper< float, detail::FloatType::FLOAT16 > Float16
detail::FloatWrapper< float, detail::FloatType::FLOAT32 > Float32
detail::VarIntWrapper< int32_t, detail::VarIntType::VAR32 > VarInt32
detail::VarIntWrapper< uint16_t, detail::VarIntType::VAR16 > VarUInt16
detail::VarIntWrapper< uint64_t, detail::VarIntType::VAR64 > VarUInt64
uint32_t convertSizeToUInt32(size_t value)
detail::VarIntWrapper< int16_t, detail::VarIntType::VAR16 > VarInt16
detail::FloatWrapper< double, detail::FloatType::FLOAT64 > Float64
detail::VarIntWrapper< uint32_t, detail::VarIntType::VAR32 > VarUInt32
detail::VarIntWrapper< int64_t, detail::VarIntType::VAR > VarInt
detail::VarIntWrapper< int64_t, detail::VarIntType::VAR64 > VarInt64
detail::VarIntWrapper< uint32_t, detail::VarIntType::VARSIZE > VarSize