libfly  6.2.2
C++20 utility library for Linux, macOS, and Windows
bit_stream.hpp
1 #pragma once
2 
3 #include "fly/types/bit_stream/detail/concepts.hpp"
4 #include "fly/types/bit_stream/types.hpp"
5 
6 #include <limits>
7 #include <streambuf>
8 
9 namespace fly::detail {
10 
33 class BitStream
34 {
35 public:
39  virtual ~BitStream();
40 
41 protected:
48  BitStream(std::streambuf *stream_buffer, byte_type starting_position) noexcept;
49 
60  template <detail::BitStreamInteger DataType>
61  DataType bit_mask(const DataType bits);
62 
63  std::streambuf *m_stream_buffer;
64 
65  buffer_type m_buffer {0};
66  byte_type m_position {0};
67 };
68 
69 //==================================================================================================
70 template <detail::BitStreamInteger DataType>
71 inline DataType BitStream::bit_mask(const DataType bits)
72 {
73  static constexpr auto s_filled = std::numeric_limits<DataType>::max();
74  static constexpr auto s_digits = std::numeric_limits<DataType>::digits;
75 
76  return (bits == 0) ? 0 : s_filled >> (s_digits - bits);
77 }
78 
79 } // namespace fly::detail
Definition: bit_stream.hpp:34
DataType bit_mask(const DataType bits)
Definition: bit_stream.hpp:71
BitStream(std::streambuf *stream_buffer, byte_type starting_position) noexcept
Definition: bit_stream.cpp:6