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

    #include "entropy_decoder_model/entropy_decoder_model_kernel_1.h"
    #include "entropy_decoder_model/entropy_decoder_model_kernel_2.h"
    #include "entropy_decoder_model/entropy_decoder_model_kernel_3.h"
    #include "entropy_decoder_model/entropy_decoder_model_kernel_4.h"
    #include "entropy_decoder_model/entropy_decoder_model_kernel_5.h"
    #include "entropy_decoder_model/entropy_decoder_model_kernel_6.h"

    #include "conditioning_class.h"
    #include "memory_manager.h"

    namespace dlib
    {

        template <
            unsigned long alphabet_size,
            typename entropy_decoder
            >
        class entropy_decoder_model
        {
            entropy_decoder_model() {}

            typedef typename conditioning_class<alphabet_size+1>::kernel_1a cc1;
            typedef typename conditioning_class<alphabet_size+1>::kernel_2a cc2;
            typedef typename conditioning_class<alphabet_size+1>::kernel_3a cc3;
            typedef typename conditioning_class<alphabet_size+1>::kernel_4a cc4a;
            typedef typename conditioning_class<alphabet_size+1>::kernel_4b cc4b;
            typedef typename conditioning_class<alphabet_size+1>::kernel_4c cc4c;
            typedef typename conditioning_class<alphabet_size+1>::kernel_4d cc4d;

        public:

            //----------- kernels ---------------

            // kernel_1
            typedef     entropy_decoder_model_kernel_1<alphabet_size,entropy_decoder,cc1>
                        kernel_1a;

            typedef     entropy_decoder_model_kernel_1<alphabet_size,entropy_decoder,cc2>
                        kernel_1b;

            typedef     entropy_decoder_model_kernel_1<alphabet_size,entropy_decoder,cc3>
                        kernel_1c;

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

            // kernel_2
            typedef     entropy_decoder_model_kernel_2<alphabet_size,entropy_decoder,cc1,cc1>
                        kernel_2a;

            typedef     entropy_decoder_model_kernel_2<alphabet_size,entropy_decoder,cc2,cc2>
                        kernel_2b;

            typedef     entropy_decoder_model_kernel_2<alphabet_size,entropy_decoder,cc3,cc3>
                        kernel_2c;

            typedef     entropy_decoder_model_kernel_2<alphabet_size,entropy_decoder,cc2,cc4b>
                        kernel_2d;

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

            // kernel_3
            typedef     entropy_decoder_model_kernel_3<alphabet_size,entropy_decoder,cc1,cc4b>
                        kernel_3a;

            typedef     entropy_decoder_model_kernel_3<alphabet_size,entropy_decoder,cc2,cc4b>
                        kernel_3b;

            typedef     entropy_decoder_model_kernel_3<alphabet_size,entropy_decoder,cc3,cc4b>
                        kernel_3c;

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

            // kernel_4
            typedef     entropy_decoder_model_kernel_4<alphabet_size,entropy_decoder,200000,4>
                        kernel_4a;
            typedef     entropy_decoder_model_kernel_4<alphabet_size,entropy_decoder,1000000,5>
                        kernel_4b;

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

            // kernel_5
            typedef     entropy_decoder_model_kernel_5<alphabet_size,entropy_decoder,200000,4>
                        kernel_5a;
            typedef     entropy_decoder_model_kernel_5<alphabet_size,entropy_decoder,1000000,5>
                        kernel_5b;
            typedef     entropy_decoder_model_kernel_5<alphabet_size,entropy_decoder,2500000,7>
                        kernel_5c;

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

            // kernel_6
            typedef     entropy_decoder_model_kernel_6<alphabet_size,entropy_decoder>
                        kernel_6a;

        };
    }

    #endif // DLIB_ENTROPY_DECODER_MODEl_