    // Copyright (C) 2003  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #ifndef DLIB_LZP_BUFFER_KERNEl_C_
    #define DLIB_LZP_BUFFER_KERNEl_C_

    #include "lzp_buffer_kernel_abstract.h"
    #include "../algs.h"
    #include "../assert.h"
    #include <iostream>

    namespace dlib
    {

        template <
            typename lzp_base
            >
        class lzp_buffer_kernel_c : public lzp_base
        {

            public:
            lzp_buffer_kernel_c (
                unsigned long buffer_size
            );

            unsigned char operator[] (
                unsigned long index
            ) const;

            unsigned long make_safe (
                unsigned long buffer_size
            )
            /*!
                ensures
                    - if ( 10 < buffer_size < 32) then
                        - returns buffer_size
                    - else
                        - throws due to failed CASSERT
            !*/
            {

                // make sure requires clause is not broken
                DLIB_CASSERT( 10 < buffer_size && buffer_size < 32,
                    "\tlzp_buffer::lzp_buffer(unsigned long)"
                    << "\n\tbuffer_size must be in the range 11 to 31."
                    << "\n\tthis:         " << this
                    << "\n\tbuffer_size:  " << buffer_size
                    );

                return buffer_size;
            }

        };

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

        template <
            typename lzp_base
            >
        unsigned char lzp_buffer_kernel_c<lzp_base>::
        operator[] (
                unsigned long index
        ) const
        {
            // make sure requires clause is not broken
            DLIB_CASSERT( index < this->size(),
                "\tunsigned char lzp_buffer::operator[](unsigned long) const"
                << "\n\tindex must be in the range 0 to size()()-1"
                << "\n\tthis:    " << this
                << "\n\tsize():  " << this->size()
                << "\n\tindex:   " << index
                );

            // call the real function
            return lzp_base::operator[](index);
        }

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

        template <
            typename lzp_base
            >
        lzp_buffer_kernel_c<lzp_base>::
        lzp_buffer_kernel_c (
            unsigned long buffer_size
        ) :
            lzp_base(make_safe(buffer_size))
        {
        }

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

    }

    #endif // DLIB_LZP_BUFFER_KERNEl_C_