42 const u8* GetBuffer()
const {
return buffer_; }
44 u8* GetBuffer() {
return buffer_; }
46 size_t GetOffsetBits()
const {
return offset_bits_; }
48 size_t GetSizeBits()
const {
return size_bits_; }
50 void Advance(
size_t num_bits);
55 size_t GetBitsRemaining()
const;
79 bool Write(u64 val,
size_t num_bits);
86 size_t Copy(u8* dest_buffer,
size_t num_bits);
89 u8* buffer_ =
nullptr;
90 size_t offset_bits_ = 0;
91 size_t size_bits_ = 0;
105 void Advance(
size_t num_bytes);
119 void Write(std::span<const u8> buf);
122 void Read(
void* buf,
size_t len) {
return Read(std::span<u8>(
reinterpret_cast<u8*
>(buf), len)); }
125 void Write(
const void* buf,
size_t len) {
126 return Write(std::span<const u8>(
reinterpret_cast<const u8*
>(buf), len));
129 const u8* GetData()
const {
return data_; }
131 u8* GetData() {
return data_; }
133 size_t GetSize()
const {
return data_length_; }
135 size_t GetOffset()
const {
return offset_; }
137 void SetOffset(
size_t offset) { offset_ = offset; }
144 template <
typename T>
147 Read(std::span<u8>(
reinterpret_cast<u8*
>(&data),
sizeof(T)));
152 template <
typename T>
154 Write(std::span<const u8>(
reinterpret_cast<const u8*
>(&data),
sizeof(T)));
158 void Write(
const std::string_view str) {
159 Write(
static_cast<u32
>(str.length()));
160 Write(str.data(), str.length() *
sizeof(
char));
164 void Write(
const std::u16string_view str) {
165 Write(
static_cast<u32
>(str.length()));
166 Write(str.data(), str.length() *
sizeof(
char16_t));
171 size_t data_length_ = 0;
183using RingSizeT = u32;
191 RingBuffer(u8* buffer,
size_t capacity);
193 u8* GetBuffer()
const {
return buffer_; }
195 RingSizeT GetCapacity()
const {
return capacity_; }
202 bool IsEmpty()
const {
return read_offset_ == write_offset_; }
204 RingSizeT GetReadOffset()
const {
return read_offset_; }
208 return reinterpret_cast<uintptr_t
>(buffer_) +
static_cast<uintptr_t
>(read_offset_);
216 void SetReadOffset(
size_t offset) { read_offset_ =
static_cast<RingSizeT
>(offset) % capacity_; }
220 RingSizeT read_offs = read_offset_;
221 RingSizeT write_offs = write_offset_;
222 RingSizeT cap = capacity_;
223 if (read_offs <= write_offs) {
224 return write_offs - read_offs;
226 return (cap - read_offs) + write_offs;
230 RingSizeT GetWriteOffset()
const {
return write_offset_; }
234 return reinterpret_cast<uintptr_t
>(buffer_) +
static_cast<uintptr_t
>(write_offset_);
242 void SetWriteOffset(
size_t offset) { write_offset_ =
static_cast<RingSizeT
>(offset) % capacity_; }
249 RingSizeT read_offs = read_offset_;
250 RingSizeT write_offs = write_offset_;
251 RingSizeT cap = capacity_;
252 if (read_offs == write_offs) {
254 }
else if (write_offs < read_offs) {
255 return read_offs - write_offs;
257 return (cap - write_offs) + read_offs;
271 RingSizeT first_length;
272 RingSizeT second_length;
295 size_t Read(u8* buffer,
size_t count);
303 template <
typename T>
304 size_t Read(T* buffer,
size_t count) {
305 return Read(
reinterpret_cast<u8*
>(buffer), count);
309 template <
typename T>
311 static_assert(std::is_fundamental<T>::value,
"Immediate read only supports basic types!");
314 size_t read =
Read(
reinterpret_cast<u8*
>(&imm),
sizeof(T));
320 template <
typename T>
322 static_assert(std::is_fundamental<T>::value,
"Immediate read only supports basic types!");
325 size_t read =
Read(
reinterpret_cast<u8*
>(&imm),
sizeof(T));
337 size_t Write(
const u8* buffer,
size_t count);
345 template <
typename T>
346 size_t Write(
const T* buffer,
size_t count) {
347 return Write(
reinterpret_cast<const u8*
>(buffer), count);
355 template <
typename T>
357 return Write(
reinterpret_cast<const u8*
>(&data),
sizeof(T));
361 u8* __restrict buffer_ =
nullptr;
362 RingSizeT capacity_ = 0;
363 RingSizeT read_offset_ = 0;
364 RingSizeT write_offset_ = 0;
371 RingSizeT read_offs = read_offset_;
372 RingSizeT next_read_offs = read_offs + 4;
373 if (next_read_offs == capacity_) [[unlikely]] {
376 read_offset_ = next_read_offs;
#define REX_ASSERT(cond,...)
Definition assert.h:84
bool Write(u64 val, size_t num_bits)
u64 Read(size_t num_bits)
size_t Copy(u8 *dest_buffer, size_t num_bits)
u64 Peek(size_t num_bits)
void SetOffset(size_t offset_bits)
BitStream(u8 *buffer, size_t size_in_bits)
void Write(std::span< const u8 > buf)
void Write(T data)
Definition stream.h:153
ByteStream(u8 *data, size_t data_length, size_t offset=0)
void Read(std::span< u8 > buf)
void Write(const std::string_view str)
Definition stream.h:158
void Write(const void *buf, size_t len)
Definition stream.h:125
void Write(const std::u16string_view str)
Definition stream.h:164
T Read()
Definition stream.h:145
void Read(void *buf, size_t len)
Definition stream.h:122
size_t Write(const u8 *buffer, size_t count)
size_t Write(const T *buffer, size_t count)
Definition stream.h:346
void AdvanceWrite(size_t count)
T Read()
Definition stream.h:310
RingSizeT GetReadCount() const
Definition stream.h:219
void AdvanceRead(size_t count)
size_t Write(T &data)
Definition stream.h:356
RingSizeT GetWriteCount() const
Definition stream.h:248
T ReadAndSwap()
Definition stream.h:321
bool IsEmpty() const
Definition stream.h:202
ReadRange BeginRead(size_t count)
size_t Read(T *buffer, size_t count)
Definition stream.h:304
void EndRead(ReadRange read_range)
size_t Read(u8 *buffer, size_t count)
void SetReadOffset(size_t offset)
Definition stream.h:216
void SetWriteOffset(size_t offset)
Definition stream.h:242
uintptr_t GetWritePtr() const
Definition stream.h:233
uintptr_t GetReadPtr() const
Definition stream.h:207
T load(const void *mem)
Definition endian.h:134
constexpr T byte_swap(T value) noexcept
Definition types.h:52
const u8 *__restrict second
Definition stream.h:270
const u8 *__restrict first
Definition stream.h:269
Integer types, byte order wrappers and size literals.