1#ifndef ZSERIO_BIT_STREAM_WRITER_H_INC
2#define ZSERIO_BIT_STREAM_WRITER_H_INC
73 template <
typename ALLOC>
238 template <
typename ALLOC>
254 writeUnsignedBits32Impl(*
it, 8);
296 void alignTo(
size_t alignment);
305 return m_buffer.
data() !=
nullptr;
329 return m_bufferBitSize;
339 void checkCapacity(
size_t bitSize)
const;
340 void throwInsufficientCapacityException()
const;
344 size_t m_bufferBitSize;
350inline void write(BitStreamWriter& writer,
Bool value)
352 writer.writeBool(value);
355template <BitSize BIT_SIZE,
bool IS_SIGNED>
356void 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);
386void 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);
412inline void write(BitStreamWriter& writer,
VarInt16 value)
414 writer.writeVarInt16(value);
417inline void write(BitStreamWriter& writer,
VarInt32 value)
419 writer.writeVarInt32(value);
422inline void write(BitStreamWriter& writer,
VarInt64 value)
424 writer.writeVarInt64(value);
427inline void write(BitStreamWriter& writer,
VarInt value)
429 writer.writeVarInt(value);
432inline void write(BitStreamWriter& writer,
VarUInt16 value)
434 writer.writeVarUInt16(value);
437inline void write(BitStreamWriter& writer,
VarUInt32 value)
439 writer.writeVarUInt32(value);
442inline void write(BitStreamWriter& writer,
VarUInt64 value)
444 writer.writeVarUInt64(value);
447inline void write(BitStreamWriter& writer,
VarUInt value)
449 writer.writeVarUInt(value);
452inline void write(BitStreamWriter& writer,
VarSize value)
454 writer.writeVarSize(value);
457inline void write(BitStreamWriter& writer,
Float16 value)
459 writer.writeFloat16(value);
462inline void write(BitStreamWriter& writer,
Float32 value)
464 writer.writeFloat32(value);
467inline void write(BitStreamWriter& writer,
Float64 value)
469 writer.writeFloat64(value);
472inline void write(BitStreamWriter& writer,
BytesView value)
474 writer.writeBytes(value);
477inline void write(BitStreamWriter& writer, std::string_view value)
479 writer.writeString(value);
482template <
typename ALLOC>
483inline void write(BitStreamWriter& writer,
const BasicBitBufferView<ALLOC>& value)
485 writer.writeBitBuffer(value.get());
~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=(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 & operator=(const 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
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