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