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