88
99#pragma once
1010
11- #include " ciso646.h"
12- #include " daw_bit_queues.h"
13- #include " daw_exception.h"
11+ #include " daw/ciso646.h"
12+ #include " daw/daw_bit_count.h"
13+ #include " daw/daw_bit_queues.h"
14+ #include " daw/daw_exception.h"
1415
1516#include < cstdint>
1617#include < iterator>
1718#include < stdexcept>
1819#include < type_traits>
1920
2021namespace daw {
21- /* template<typename InputIteratorF, typename InputIteratorL> class bit_stream;
22-
23- template<typename BitStream>
24- struct bit_stream_iterator: public std::input_iterator_tag {
25- using value_type = typename
26- std::iterator_traits<InputIteratorF>::value_type; using difference_type =
27- typename std::iterator_traits<InputIteratorF>::difference_type; using
28- reference = typename std::iterator_traits<InputIteratorF>::reference; using
29- pointer = typename std::iterator_traits<InputIteratorF>::pointer; private:
30- BitStream * m_bit_stream;
31- bool m_is_end;
32-
33- bool at_end( ) const {
34- return !m_bit_stream->valid( );
35- }
36-
37- template<typename InputIteratorF, typename InputIteratorL> friend class
38- bit_stream;
39-
40- bit_stream_iterator( BitStream * bit_stream, bool is_end ):
41- m_bit_stream{ bit_stream },
42- m_is_end{ is_end } { }
43- public:
44- bit_stream_iterator( BitStream & bit_stream ):
45- bit_stream_iterator{ &bit_stream, !bit_stream } { }
46-
47- bool operator==( bit_stream_iterator const & rhs ) const {
48- return (std::tie( m_bit_stream, m_bit_stream->m_first,
49- m_bit_stream->m_left_overs ) == std::tie( rhs.m_bit_stream,
50- rhs.m_bit_stream->m_first, rhs.m_bit_stream->m_left_overs )) or (is_end or
51- !valid)
52- }
53-
54- bool operator!=( bit_stream_iterator const & rhs ) const {
55- return std::tie( m_bit_stream, m_bit_stream->m_first,
56- m_bit_stream->m_left_overs ) != std::tie( rhs.m_bit_stream,
57- rhs.m_bit_stream->m_first, rhs.m_bit_stream->m_left_overs );
58- }
59-
60- value_type operator*( ) {
61- return m_bit
62- }
63- };*/
64-
6522 template <typename InputIteratorF, typename InputIteratorL,
6623 typename BitQueueLSB = bit_queue_source_native_endian>
6724 struct bit_stream {
@@ -90,9 +47,9 @@ namespace daw {
9047 return valid ( );
9148 }
9249
93- value_type pop_bits ( size_t num_bits = sizeof ( value_type ) * 8 ) {
50+ value_type pop_bits ( std:: size_t num_bits = bit_count_v< value_type> ) {
9451 daw::exception::dbg_throw_on_true<std::overflow_error>(
95- num_bits > sizeof ( value_type ) * 8 ,
52+ num_bits > bit_count_v< value_type> ,
9653 " Attempt to pop more bits than can fit into value" );
9754 daw::exception::dbg_throw_on_true<std::runtime_error>(
9855 num_bits == 0 , " Attempt to pop 0 bits" );
@@ -123,15 +80,15 @@ namespace daw {
12380 template <typename T, typename BitStream>
12481 auto pop_value ( BitStream &bs, size_t bits_needed ) {
12582 daw::exception::dbg_throw_on_false (
126- bits_needed <= sizeof ( T ) * 8 ,
83+ bits_needed <= bit_count_t <T> ,
12784 " Attempt to extra more bits than can fit" );
12885
12986 using value_type = typename BitStream::value_type;
13087 T result = 0 ;
131- while ( bits_needed >= sizeof ( value_type ) * 8 ) {
132- result <<= sizeof ( value_type ) * 8 ;
88+ while ( bits_needed >= bit_count_v< value_type> ) {
89+ result <<= bit_count_v< value_type> ;
13390 result |= bs.pop_bits ( );
134- bits_needed -= sizeof ( value_type ) * 8 ;
91+ bits_needed -= bit_count_v< value_type> ;
13592 }
13693 if ( bits_needed > 0 ) {
13794 result <<= bits_needed;
@@ -142,28 +99,28 @@ namespace daw {
14299
143100 template <typename T, typename BitStream>
144101 auto pop_value ( BitStream &bs ) {
145- return pop_value<T>( bs, sizeof ( T ) * 8 );
102+ return pop_value<T>( bs, bit_count_v<T> );
146103 }
147104
148105 template <typename BitStream>
149106 void skip_bits ( BitStream &bs, size_t bits_needed ) {
150107 using value_type = typename BitStream::value_type;
151108
152- while ( bits_needed >= sizeof ( value_type ) * 8 ) {
109+ while ( bits_needed >= bit_count_v< value_type> ) {
153110 bs.pop_bits ( );
154- bits_needed -= sizeof ( value_type ) * 8 ;
111+ bits_needed -= bit_count_v< value_type> ;
155112 }
156113 }
157114
158115 template <typename BitStream>
159116 void skip_bytes ( BitStream &bs, size_t bytes_needed ) {
160- skip_bits ( bs, bytes_needed * 8 );
117+ skip_bits ( bs, bytes_needed * bit_count_v< char > );
161118 }
162119
163120 template <typename BitStream, typename TestValue>
164121 void skip_until ( BitStream &bs, TestValue const &v, size_t bit_count ) {
165122 daw::exception::dbg_throw_on_true (
166- bit_count > sizeof ( TestValue ) * 8 ,
123+ bit_count > bit_count_v< TestValue> ,
167124 " Attempt to use more bits than can be put into TestValue" );
168125 daw::exception::dbg_throw_on_true ( bit_count < 1 ,
169126 " Attempt to pop less than 1 bits" );
0 commit comments