summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/bit_stream
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/bit_stream')
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp200
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_kernel_1.h120
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_kernel_abstract.h185
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_kernel_c.h172
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_multi_1.h103
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_multi_abstract.h77
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_multi_c.h101
7 files changed, 958 insertions, 0 deletions
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp b/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp
new file mode 100644
index 000000000..f49db14d5
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp
@@ -0,0 +1,200 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_BIT_STREAM_KERNEL_1_CPp_
+#define DLIB_BIT_STREAM_KERNEL_1_CPp_
+
+
+#include "bit_stream_kernel_1.h"
+#include "../algs.h"
+
+#include <iostream>
+
+namespace dlib
+{
+
+ inline void swap (
+ bit_stream_kernel_1& a,
+ bit_stream_kernel_1& b
+ ) { a.swap(b); }
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // member function definitions
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ clear (
+ )
+ {
+ if (write_mode)
+ {
+ write_mode = false;
+
+ // flush output buffer
+ if (buffer_size > 0)
+ {
+ buffer <<= 8 - buffer_size;
+ osp->write(reinterpret_cast<char*>(&buffer),1);
+ }
+ }
+ else
+ read_mode = false;
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ set_input_stream (
+ std::istream& is
+ )
+ {
+ isp = &is;
+ read_mode = true;
+
+ buffer_size = 0;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ set_output_stream (
+ std::ostream& os
+ )
+ {
+ osp = &os;
+ write_mode = true;
+
+ buffer_size = 0;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ close (
+ )
+ {
+ if (write_mode)
+ {
+ write_mode = false;
+
+ // flush output buffer
+ if (buffer_size > 0)
+ {
+ buffer <<= 8 - buffer_size;
+ osp->write(reinterpret_cast<char*>(&buffer),1);
+ }
+ }
+ else
+ read_mode = false;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ bool bit_stream_kernel_1::
+ is_in_write_mode (
+ ) const
+ {
+ return write_mode;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ bool bit_stream_kernel_1::
+ is_in_read_mode (
+ ) const
+ {
+ return read_mode;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ write (
+ int bit
+ )
+ {
+ // flush buffer if necessary
+ if (buffer_size == 8)
+ {
+ buffer <<= 8 - buffer_size;
+ if (osp->rdbuf()->sputn(reinterpret_cast<char*>(&buffer),1) == 0)
+ {
+ throw std::ios_base::failure("error occurred in the bit_stream object");
+ }
+
+ buffer_size = 0;
+ }
+
+ ++buffer_size;
+ buffer <<= 1;
+ buffer += static_cast<unsigned char>(bit);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ bool bit_stream_kernel_1::
+ read (
+ int& bit
+ )
+ {
+ // get new byte if necessary
+ if (buffer_size == 0)
+ {
+ if (isp->rdbuf()->sgetn(reinterpret_cast<char*>(&buffer), 1) == 0)
+ {
+ // if we didn't read anything then return false
+ return false;
+ }
+
+ buffer_size = 8;
+ }
+
+ // put the most significant bit from buffer into bit
+ bit = static_cast<int>(buffer >> 7);
+
+ // shift out the bit that was just read
+ buffer <<= 1;
+ --buffer_size;
+
+ return true;
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ void bit_stream_kernel_1::
+ swap (
+ bit_stream_kernel_1& item
+ )
+ {
+
+ std::istream* isp_temp = item.isp;
+ std::ostream* osp_temp = item.osp;
+ bool write_mode_temp = item.write_mode;
+ bool read_mode_temp = item.read_mode;
+ unsigned char buffer_temp = item.buffer;
+ unsigned short buffer_size_temp = item.buffer_size;
+
+ item.isp = isp;
+ item.osp = osp;
+ item.write_mode = write_mode;
+ item.read_mode = read_mode;
+ item.buffer = buffer;
+ item.buffer_size = buffer_size;
+
+
+ isp = isp_temp;
+ osp = osp_temp;
+ write_mode = write_mode_temp;
+ read_mode = read_mode_temp;
+ buffer = buffer_temp;
+ buffer_size = buffer_size_temp;
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+#endif // DLIB_BIT_STREAM_KERNEL_1_CPp_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.h b/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.h
new file mode 100644
index 000000000..801e93e0a
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.h
@@ -0,0 +1,120 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_BIT_STREAM_KERNEl_1_
+#define DLIB_BIT_STREAM_KERNEl_1_
+
+#include "bit_stream_kernel_abstract.h"
+#include <iosfwd>
+
+namespace dlib
+{
+
+ class bit_stream_kernel_1
+ {
+
+ /*!
+ INITIAL VALUE
+ write_mode == false
+ read_mode == false
+
+ CONVENTION
+ write_mode == is_in_write_mode()
+ read_mode == is_in_read_mode()
+
+ if (write_mode)
+ {
+ osp == pointer to an ostream object
+ buffer == the low order bits of buffer are the bits to be
+ written
+ buffer_size == the number of low order bits in buffer that are
+ bits that should be written
+ the lowest order bit is the last bit entered by the user
+ }
+
+ if (read_mode)
+ {
+ isp == pointer to an istream object
+ buffer == the high order bits of buffer are the bits
+ waiting to be read by the user
+ buffer_size == the number of high order bits in buffer that
+ are bits that are waiting to be read
+ the highest order bit is the next bit to give to the user
+ }
+ !*/
+
+
+ public:
+
+ bit_stream_kernel_1 (
+ ) :
+ write_mode(false),
+ read_mode(false)
+ {}
+
+ virtual ~bit_stream_kernel_1 (
+ )
+ {}
+
+ void clear (
+ );
+
+ void set_input_stream (
+ std::istream& is
+ );
+
+ void set_output_stream (
+ std::ostream& os
+ );
+
+ void close (
+ );
+
+ inline bool is_in_write_mode (
+ ) const;
+
+ inline bool is_in_read_mode (
+ ) const;
+
+ inline void write (
+ int bit
+ );
+
+ bool read (
+ int& bit
+ );
+
+ void swap (
+ bit_stream_kernel_1& item
+ );
+
+ private:
+
+ // member data
+ std::istream* isp;
+ std::ostream* osp;
+ bool write_mode;
+ bool read_mode;
+ unsigned char buffer;
+ unsigned short buffer_size;
+
+ // restricted functions
+ bit_stream_kernel_1(bit_stream_kernel_1&); // copy constructor
+ bit_stream_kernel_1& operator=(bit_stream_kernel_1&); // assignment operator
+
+ };
+
+ inline void swap (
+ bit_stream_kernel_1& a,
+ bit_stream_kernel_1& b
+ );
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#ifdef NO_MAKEFILE
+#include "bit_stream_kernel_1.cpp"
+#endif
+
+#endif // DLIB_BIT_STREAM_KERNEl_1_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_kernel_abstract.h b/ml/dlib/dlib/bit_stream/bit_stream_kernel_abstract.h
new file mode 100644
index 000000000..00c2ae3b9
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_kernel_abstract.h
@@ -0,0 +1,185 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#undef DLIB_BIT_STREAM_KERNEl_ABSTRACT_
+#ifdef DLIB_BIT_STREAM_KERNEl_ABSTRACT_
+
+#include <iosfwd>
+
+namespace dlib
+{
+
+ class bit_stream
+ {
+
+ /*!
+ INITIAL VALUE
+ is_in_write_mode() == false
+ is_in_read_mode() == false
+
+ WHAT THIS OBJECT REPRESENTS
+ this object is a middle man between a user and the iostream classes.
+ it allows single bits to be read/written easily to/from
+ the iostream classes
+
+ BUFFERING:
+ This object will only read/write single bytes at a time from/to the
+ iostream objects. Any buffered bits still in the bit_stream object
+ when it is closed or destructed are lost if it is in read mode. If
+ it is in write mode then any remaining bits are guaranteed to be
+ written to the output stream by the time it is closed or destructed.
+ !*/
+
+
+ public:
+
+ bit_stream (
+ );
+ /*!
+ ensures
+ - #*this is properly initialized
+ throws
+ - std::bad_alloc
+ !*/
+
+ virtual ~bit_stream (
+ );
+ /*!
+ ensures
+ - all memory associated with *this has been released
+ !*/
+
+ void clear (
+ );
+ /*!
+ ensures
+ - #*this has its initial value
+ throws
+ - std::bad_alloc
+ if this exception is thrown then *this is unusable
+ until clear() is called and succeeds
+ !*/
+
+
+ void set_input_stream (
+ std::istream& is
+ );
+ /*!
+ requires
+ - is_in_write_mode() == false
+ - is_in_read_mode() == false
+ - is is ready to give input
+ ensures
+ - #is_in_write_mode() == false
+ - #is_in_read_mode() == true
+ - #*this will now be reading from is
+ throws
+ - std::bad_alloc
+ !*/
+
+ void set_output_stream (
+ std::ostream& os
+ );
+ /*!
+ requires
+ - is_in_write_mode() == false
+ - is_in_read_mode() == false
+ - os is ready to take output
+ ensures
+ - #is_in_write_mode() == true
+ - #is_in_read_mode() == false
+ - #*this will now write to os
+ throws
+ - std::bad_alloc
+ !*/
+
+
+
+ void close (
+ );
+ /*!
+ requires
+ - is_in_write_mode() == true || is_in_read_mode() == true
+ ensures
+ - #is_in_write_mode() == false
+ - #is_in_read_mode() == false
+ !*/
+
+ bool is_in_write_mode (
+ ) const;
+ /*!
+ ensures
+ - returns true if *this is associated with an output stream object
+ - returns false otherwise
+ !*/
+
+ bool is_in_read_mode (
+ ) const;
+ /*!
+ ensures
+ - returns true if *this is associated with an input stream object
+ - returns false otherwise
+ !*/
+
+ void write (
+ int bit
+ );
+ /*!
+ requires
+ - is_in_write_mode() == true
+ - bit == 0 || bit == 1
+ ensures
+ - bit will be written to the ostream object associated with *this
+ throws
+ - std::ios_base::failure
+ if (there was a problem writing to the output stream) then
+ this exception will be thrown. #*this will be unusable until
+ clear() is called and succeeds
+ - any other exception
+ if this exception is thrown then #*this is unusable
+ until clear() is called and succeeds
+ !*/
+
+ bool read (
+ int& bit
+ );
+ /*!
+ requires
+ - is_in_read_mode() == true
+ ensures
+ - the next bit has been read and placed into #bit
+ - returns true if the read was successful, else false
+ (ex. false if EOF has been reached)
+ throws
+ - any exception
+ if this exception is thrown then #*this is unusable
+ until clear() is called and succeeds
+ !*/
+
+ void swap (
+ bit_stream& item
+ );
+ /*!
+ ensures
+ - swaps *this and item
+ !*/
+
+ private:
+
+ // restricted functions
+ bit_stream(bit_stream&); // copy constructor
+ bit_stream& operator=(bit_stream&); // assignment operator
+
+ };
+
+ inline void swap (
+ bit_stream& a,
+ bit_stream& b
+ ) { a.swap(b); }
+ /*!
+ provides a global swap function
+ !*/
+
+}
+
+#endif // DLIB_BIT_STREAM_KERNEl_ABSTRACT_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_kernel_c.h b/ml/dlib/dlib/bit_stream/bit_stream_kernel_c.h
new file mode 100644
index 000000000..1d52bff20
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_kernel_c.h
@@ -0,0 +1,172 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#ifndef DLIB_BIT_STREAM_KERNEl_C_
+#define DLIB_BIT_STREAM_KERNEl_C_
+
+#include "bit_stream_kernel_abstract.h"
+#include "../algs.h"
+#include "../assert.h"
+#include <iosfwd>
+
+namespace dlib
+{
+
+ template <
+ typename bit_stream_base // implements bit_stream/bit_stream_kernel_abstract.h
+ >
+ class bit_stream_kernel_c : public bit_stream_base
+ {
+ public:
+
+
+ void set_input_stream (
+ std::istream& is
+ );
+
+ void set_output_stream (
+ std::ostream& os
+ );
+
+ void close (
+ );
+
+ void write (
+ int bit
+ );
+
+ bool read (
+ int& bit
+ );
+
+ };
+
+ template <
+ typename bit_stream_base
+ >
+ inline void swap (
+ bit_stream_kernel_c<bit_stream_base>& a,
+ bit_stream_kernel_c<bit_stream_base>& b
+ ) { a.swap(b); }
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // member function definitions
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ void bit_stream_kernel_c<bit_stream_base>::
+ set_input_stream (
+ std::istream& is
+ )
+ {
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_write_mode() == false ) && ( this->is_in_read_mode() == false ),
+ "\tvoid bit_stream::set_intput_stream"
+ << "\n\tbit_stream must not be in write or read mode"
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ bit_stream_base::set_input_stream(is);
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ void bit_stream_kernel_c<bit_stream_base>::
+ set_output_stream (
+ std::ostream& os
+ )
+ {
+
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_write_mode() == false ) && ( this->is_in_read_mode() == false ),
+ "\tvoid bit_stream::set_output_stream"
+ << "\n\tbit_stream must not be in write or read mode"
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ bit_stream_base::set_output_stream(os);
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ void bit_stream_kernel_c<bit_stream_base>::
+ close (
+ )
+ {
+
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_write_mode() == true ) || ( this->is_in_read_mode() == true ),
+ "\tvoid bit_stream::close"
+ << "\n\tyou can't close a bit_stream that isn't open"
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ bit_stream_base::close();
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ void bit_stream_kernel_c<bit_stream_base>::
+ write (
+ int bit
+ )
+ {
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_write_mode() == true ) && ( bit == 0 || bit == 1 ),
+ "\tvoid bit_stream::write"
+ << "\n\tthe bit stream bust be in write mode and bit must be either 1 or 0"
+ << "\n\tis_in_write_mode() == " << this->is_in_write_mode()
+ << "\n\tbit == " << bit
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ bit_stream_base::write(bit);
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ bool bit_stream_kernel_c<bit_stream_base>::
+ read (
+ int& bit
+ )
+ {
+
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_read_mode() == true ),
+ "\tbool bit_stream::read"
+ << "\n\tyou can't read from a bit_stream that isn't in read mode"
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ return bit_stream_base::read(bit);
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_BIT_STREAM_KERNEl_C_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_multi_1.h b/ml/dlib/dlib/bit_stream/bit_stream_multi_1.h
new file mode 100644
index 000000000..bf1cc0357
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_multi_1.h
@@ -0,0 +1,103 @@
+// 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_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_multi_abstract.h b/ml/dlib/dlib/bit_stream/bit_stream_multi_abstract.h
new file mode 100644
index 000000000..061af94f4
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_multi_abstract.h
@@ -0,0 +1,77 @@
+// Copyright (C) 2003 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#undef DLIB_BIT_STREAM_MULTi_ABSTRACT_
+#ifdef DLIB_BIT_STREAM_MULTi_ABSTRACT_
+
+#include "bit_stream_kernel_abstract.h"
+
+namespace dlib
+{
+ template <
+ typename bit_stream_base
+ >
+ class bit_stream_multi : public bit_stream_base
+ {
+
+ /*!
+ REQUIREMENTS ON BIT_STREAM_BASE
+ it is an implementation of bit_stream/bit_stream_kernel_abstract.h
+
+
+ WHAT THIS EXTENSION DOES FOR BIT_STREAM
+ this gives a bit_stream object the ability to read/write multible bits
+ at a time
+ !*/
+
+
+ public:
+
+ void multi_write (
+ unsigned long data,
+ int num_to_write
+ );
+ /*!
+ requires
+ - is_in_write_mode() == true
+ - 0 <= num_to_write <= 32
+ ensures
+ - num_to_write low order bits from data will be written to the ostream
+ - object associated with *this
+ example: if data is 10010 then the bits will be written in the
+ order 1,0,0,1,0
+ !*/
+
+
+ int multi_read (
+ unsigned long& data,
+ int num_to_read
+ );
+ /*!
+ requires
+ - is_in_read_mode() == true
+ - 0 <= num_to_read <= 32
+ ensures
+ - tries to read num_to_read bits into the low order end of #data
+ example: if the incoming bits were 10010 then data would end
+ up with 10010 as its low order bits
+ - all of the bits in #data not filled in by multi_read() are zero
+ - returns the number of bits actually read into #data
+ !*/
+
+ };
+
+ template <
+ typename bit_stream_base
+ >
+ inline void swap (
+ bit_stream_multi<bit_stream_base>& a,
+ bit_stream_multi<bit_stream_base>& b
+ ) { a.swap(b); }
+ /*!
+ provides a global swap function
+ !*/
+
+}
+
+#endif // DLIB_BIT_STREAM_MULTi_ABSTRACT_
+
diff --git a/ml/dlib/dlib/bit_stream/bit_stream_multi_c.h b/ml/dlib/dlib/bit_stream/bit_stream_multi_c.h
new file mode 100644
index 000000000..de80c6328
--- /dev/null
+++ b/ml/dlib/dlib/bit_stream/bit_stream_multi_c.h
@@ -0,0 +1,101 @@
+// 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_C_
+#define DLIB_BIT_STREAM_MULTi_C_
+
+#include "bit_stream_multi_abstract.h"
+#include "../algs.h"
+#include "../assert.h"
+
+namespace dlib
+{
+ template <
+ typename bit_stream_base // implements bit_stream/bit_stream_multi_abstract.h
+ >
+ class bit_stream_multi_c : 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_c<bit_stream_base>& a,
+ bit_stream_multi_c<bit_stream_base>& b
+ ) { a.swap(b); }
+
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+ // member function definitions
+// ----------------------------------------------------------------------------------------
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ void bit_stream_multi_c<bit_stream_base>::
+ multi_write (
+ unsigned long data,
+ int num_to_write
+ )
+ {
+ // make sure requires clause is not broken
+ DLIB_CASSERT( (this->is_in_write_mode() == true) && (num_to_write >= 0 && num_to_write <=32),
+ "\tvoid bit_stream::write"
+ << "\n\tthe bit stream bust be in write mode and"
+ << "\n\tnum_to_write must be between 0 and 32 inclusive"
+ << "\n\tnum_to_write == " << num_to_write
+ << "\n\tis_in_write_mode() == " << this->is_in_write_mode()
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ bit_stream_base::multi_write(data,num_to_write);
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename bit_stream_base
+ >
+ int bit_stream_multi_c<bit_stream_base>::
+ multi_read (
+ unsigned long& data,
+ int num_to_read
+ )
+ {
+
+ // make sure requires clause is not broken
+ DLIB_CASSERT(( this->is_in_read_mode() == true && ( num_to_read >= 0 && num_to_read <=32 ) ),
+ "\tvoid bit_stream::read"
+ << "\n\tyou can't read from a bit_stream that isn't in read mode and"
+ << "\n\tnum_to_read must be between 0 and 32 inclusive"
+ << "\n\tnum_to_read == " << num_to_read
+ << "\n\tis_in_read_mode() == " << this->is_in_read_mode()
+ << "\n\tthis: " << this
+ );
+
+ // call the real function
+ return bit_stream_base::multi_read(data,num_to_read);
+
+ }
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_BIT_STREAM_MULTi_C_
+