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

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

    namespace dlib
    {

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        class entropy_decoder_model_kernel_6
        {
            /*!
                INITIAL VALUE
                    This object has no state

                CONVENTION
                    &get_entropy_decoder() == coder

                    This is an order-(-1) model.  So it doesn't really do anything.
                    Every symbol has the same probability.
            !*/

        public:

            typedef entropy_decoder entropy_decoder_type;

            entropy_decoder_model_kernel_6 (
                entropy_decoder& coder
            );

            virtual ~entropy_decoder_model_kernel_6 (
            );

            inline void clear(
            );

            inline void decode (
                unsigned long& symbol
            );

            entropy_decoder& get_entropy_decoder (
            ) { return coder; }

            static unsigned long get_alphabet_size (
            ) { return alphabet_size; }

        private:

            entropy_decoder& coder;

            // restricted functions
            entropy_decoder_model_kernel_6(entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>&);        // copy constructor
            entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>& operator=(entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>&);    // assignment operator

        };

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

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>::
        entropy_decoder_model_kernel_6 (
            entropy_decoder& coder_
        ) :
            coder(coder_)
        {
            COMPILE_TIME_ASSERT( 1 < alphabet_size && alphabet_size < 65535 );
        }

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

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>::
        ~entropy_decoder_model_kernel_6 (
        )
        {
        }

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

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        void entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>::
        clear(
        )
        {
        }

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

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        void entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>::
        decode (
            unsigned long& symbol
        )
        {
            unsigned long target;

            target = coder.get_target(alphabet_size);
            coder.decode(target,target+1);

            symbol = target;
        }

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

    }

    #endif // DLIB_ENTROPY_DECODER_MODEL_KERNEl_6_