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