    // 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_C_
    #define DLIB_BIT_STREAM_MULTi_C_

    #include "bit_stream_multi_abstract.h"
    #include "../algs.h"
    #include "../assert.h"

    namespace dlib
    {
        template <
            typename bit_stream_base // implements bit_stream/bit_stream_multi_abstract.h
            >
        class bit_stream_multi_c : 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_c<bit_stream_base>& a,
            bit_stream_multi_c<bit_stream_base>& b
        ) { a.swap(b); }

    // ----------------------------------------------------------------------------------------
    // ----------------------------------------------------------------------------------------
        // member function definitions
    // ----------------------------------------------------------------------------------------
    // ----------------------------------------------------------------------------------------

        template <
            typename bit_stream_base
            >
        void bit_stream_multi_c<bit_stream_base>::
        multi_write (
            unsigned long data,
            int num_to_write
        )
        {
            // make sure requires clause is not broken
            DLIB_CASSERT( (this->is_in_write_mode() == true) && (num_to_write >= 0 && num_to_write <=32),
                "\tvoid bit_stream::write"
                << "\n\tthe bit stream bust be in write mode and"
                << "\n\tnum_to_write must be between 0 and 32 inclusive"
                << "\n\tnum_to_write == " << num_to_write
                << "\n\tis_in_write_mode() == " << this->is_in_write_mode()
                << "\n\tthis: " << this
                );

            // call the real function
            bit_stream_base::multi_write(data,num_to_write);

        }

    // ----------------------------------------------------------------------------------------

        template <
            typename bit_stream_base
            >
        int bit_stream_multi_c<bit_stream_base>::
        multi_read (
            unsigned long& data,
            int num_to_read
        )
        {

            // make sure requires clause is not broken
            DLIB_CASSERT(( this->is_in_read_mode() == true && ( num_to_read >= 0 && num_to_read <=32 ) ),
                "\tvoid bit_stream::read"
                << "\n\tyou can't read from a bit_stream that isn't in read mode and"
                << "\n\tnum_to_read must be between 0 and 32 inclusive"
                << "\n\tnum_to_read == " << num_to_read
                << "\n\tis_in_read_mode() == " << this->is_in_read_mode()
                << "\n\tthis: " << this
                );

            // call the real function
            return bit_stream_base::multi_read(data,num_to_read);

        }

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_BIT_STREAM_MULTi_C_