104 lines
2.5 KiB
C++
104 lines
2.5 KiB
C++
// Copyright (C) 2003 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_BIT_STREAM_MULTi_1_
|
|
#define DLIB_BIT_STREAM_MULTi_1_
|
|
|
|
#include "bit_stream_multi_abstract.h"
|
|
|
|
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;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_BIT_STREAM_MULTi_1_
|
|
|