// Copyright (C) 2003 Davis E. King ([email protected]) | |
// License: Boost Software License See LICENSE.txt for the full license. | |
namespace dlib | |
{ | |
template < | |
typename bit_stream_base | |
> | |
class bit_stream_multi_1 : public bit_stream_base | |
{ | |
public: | |
void multi_write ( | |
unsigned long data, | |
int num_to_write | |
); | |
int multi_read ( | |
unsigned long& data, | |
int num_to_read | |
); | |
}; | |
template < | |
typename bit_stream_base | |
> | |
inline void swap ( | |
bit_stream_multi_1<bit_stream_base>& a, | |
bit_stream_multi_1<bit_stream_base>& b | |
) { a.swap(b); } | |
// ---------------------------------------------------------------------------------------- | |
// ---------------------------------------------------------------------------------------- | |
// member function definitions | |
// ---------------------------------------------------------------------------------------- | |
// ---------------------------------------------------------------------------------------- | |
template < | |
typename bit_stream_base | |
> | |
void bit_stream_multi_1<bit_stream_base>:: | |
multi_write ( | |
unsigned long data, | |
int num_to_write | |
) | |
{ | |
// move the first bit into the most significant position | |
data <<= 32 - num_to_write; | |
for (int i = 0; i < num_to_write; ++i) | |
{ | |
// write the first bit from data | |
this->write(static_cast<char>(data >> 31)); | |
// shift the next bit into position | |
data <<= 1; | |
} | |
} | |
// ---------------------------------------------------------------------------------------- | |
template < | |
typename bit_stream_base | |
> | |
int bit_stream_multi_1<bit_stream_base>:: | |
multi_read ( | |
unsigned long& data, | |
int num_to_read | |
) | |
{ | |
int bit, i; | |
data = 0; | |
for (i = 0; i < num_to_read; ++i) | |
{ | |
// get a bit | |
if (this->read(bit) == false) | |
break; | |
// shift data to make room for this new bit | |
data <<= 1; | |
// put bit into the least significant position in data | |
data += static_cast<unsigned long>(bit); | |
} | |
return i; | |
} | |
// ---------------------------------------------------------------------------------------- | |
} | |