summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp')
-rw-r--r--ml/dlib/dlib/bit_stream/bit_stream_kernel_1.cpp200
1 files changed, 200 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_
+