// 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_