3 #include "fly/types/bit_stream/detail/bit_stream.hpp"
4 #include "fly/types/bit_stream/detail/concepts.hpp"
5 #include "fly/types/bit_stream/types.hpp"
6 #include "fly/types/numeric/endian.hpp"
80 template <detail::BitStreamInteger DataType>
81 byte_type
read_bits(DataType &bits, byte_type size);
98 template <detail::BitStreamInteger DataType>
99 byte_type
peek_bits(DataType &bits, byte_type size);
125 void refill_buffer();
137 template <detail::BitStreamInteger DataType>
138 byte_type fill(DataType &buffer, byte_type bytes);
140 std::istream &m_stream;
142 byte_type m_header {0};
143 byte_type m_remainder {0};
147 template <detail::BitStreamInteger DataType>
150 if constexpr (detail::BitStreamBuffer<DataType>)
153 const byte_type size_high = size / 2;
154 const byte_type size_low = size - size_high;
155 std::uint32_t bits_high, bits_low;
157 const byte_type bits_read_high =
peek_bits(bits_high, size_high);
160 const byte_type bits_read_low =
peek_bits(bits_low, size_low);
163 bits = (
static_cast<DataType
>(bits_high) << size_low) | bits_low;
164 return bits_read_high + bits_read_low;
168 const byte_type bits_read =
peek_bits(bits, size);
176 template <detail::BitStreamInteger DataType>
192 !detail::BitStreamBuffer<DataType>,
193 "peek_bits only supports types smaller than buffer_type");
195 byte_type peeked = 0, lshift = 0;
200 if (size > m_position)
204 const DataType buffer =
static_cast<DataType
>(m_buffer);
205 lshift = size - m_position;
208 bits = buffer & bit_mask<DataType>(m_position);
216 size = std::min(lshift,
static_cast<byte_type
>(m_position - peeked));
220 const byte_type rshift = m_position - peeked - size;
221 const DataType buffer =
static_cast<DataType
>(m_buffer >> rshift);
223 bits |= (buffer & bit_mask<DataType>(size)) << lshift;
236 template <detail::BitStreamInteger DataType>
237 byte_type BitStreamReader::fill(DataType &buffer, byte_type bytes)
241 const std::streamsize bytes_read = m_stream_buffer->sgetn(
242 reinterpret_cast<std::ios::char_type *
>(&buffer),
243 static_cast<std::streamsize
>(bytes));
245 buffer = endian_swap_if_non_native<std::endian::big>(buffer);
246 return static_cast<byte_type
>(bytes_read);
Definition: bit_stream_reader.hpp:27
bool read_word(word_type &word)
Definition: bit_stream_reader.cpp:31
bool fully_consumed() const
Definition: bit_stream_reader.cpp:43
byte_type read_bits(DataType &bits, byte_type size)
Definition: bit_stream_reader.hpp:148
byte_type peek_bits(DataType &bits, byte_type size)
Definition: bit_stream_reader.hpp:177
BitStreamReader(std::istream &stream) noexcept
Definition: bit_stream_reader.cpp:9
void discard_bits(byte_type size)
Definition: bit_stream_reader.hpp:230
byte_type header() const
Definition: bit_stream_reader.cpp:54
bool read_byte(byte_type &byte)
Definition: bit_stream_reader.cpp:37
Definition: bit_stream.hpp:34