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

    #include "entropy_encoder_model/entropy_encoder_model_kernel_1.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_2.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_3.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_4.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_5.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_6.h"
    #include "entropy_encoder_model/entropy_encoder_model_kernel_c.h"

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

    namespace dlib
    {

        template <
            unsigned long alphabet_size,
            typename entropy_encoder
            >
        class entropy_encoder_model
        {
            entropy_encoder_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_encoder_model_kernel_1<alphabet_size,entropy_encoder,cc1>
                        kernel_1a;
            typedef     entropy_encoder_model_kernel_c<kernel_1a>
                        kernel_1a_c;

            typedef     entropy_encoder_model_kernel_1<alphabet_size,entropy_encoder,cc2>
                        kernel_1b;
            typedef     entropy_encoder_model_kernel_c<kernel_1b>
                        kernel_1b_c;

            typedef     entropy_encoder_model_kernel_1<alphabet_size,entropy_encoder,cc3>
                        kernel_1c;
            typedef     entropy_encoder_model_kernel_c<kernel_1c>
                        kernel_1c_c;

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

            // kernel_2
            typedef     entropy_encoder_model_kernel_2<alphabet_size,entropy_encoder,cc1,cc1>
                        kernel_2a;
            typedef     entropy_encoder_model_kernel_c<kernel_2a>
                        kernel_2a_c;

            typedef     entropy_encoder_model_kernel_2<alphabet_size,entropy_encoder,cc2,cc2>
                        kernel_2b;
            typedef     entropy_encoder_model_kernel_c<kernel_2b>
                        kernel_2b_c;

            typedef     entropy_encoder_model_kernel_2<alphabet_size,entropy_encoder,cc3,cc3>
                        kernel_2c;
            typedef     entropy_encoder_model_kernel_c<kernel_2c>
                        kernel_2c_c;

            typedef     entropy_encoder_model_kernel_2<alphabet_size,entropy_encoder,cc2,cc4b>
                        kernel_2d;
            typedef     entropy_encoder_model_kernel_c<kernel_2d>
                        kernel_2d_c;

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

            // kernel_3
            typedef     entropy_encoder_model_kernel_3<alphabet_size,entropy_encoder,cc1,cc4b>
                        kernel_3a;
            typedef     entropy_encoder_model_kernel_c<kernel_3a>
                        kernel_3a_c;

            typedef     entropy_encoder_model_kernel_3<alphabet_size,entropy_encoder,cc2,cc4b>
                        kernel_3b;
            typedef     entropy_encoder_model_kernel_c<kernel_3b>
                        kernel_3b_c;

            typedef     entropy_encoder_model_kernel_3<alphabet_size,entropy_encoder,cc3,cc4b>
                        kernel_3c;
            typedef     entropy_encoder_model_kernel_c<kernel_3c>
                        kernel_3c_c;

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

            // kernel_4
            typedef     entropy_encoder_model_kernel_4<alphabet_size,entropy_encoder,200000,4>
                        kernel_4a;
            typedef     entropy_encoder_model_kernel_c<kernel_4a>
                        kernel_4a_c;

            typedef     entropy_encoder_model_kernel_4<alphabet_size,entropy_encoder,1000000,5>
                        kernel_4b;
            typedef     entropy_encoder_model_kernel_c<kernel_4b>
                        kernel_4b_c;

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

            // kernel_5
            typedef     entropy_encoder_model_kernel_5<alphabet_size,entropy_encoder,200000,4>
                        kernel_5a;
            typedef     entropy_encoder_model_kernel_c<kernel_5a>
                        kernel_5a_c;

            typedef     entropy_encoder_model_kernel_5<alphabet_size,entropy_encoder,1000000,5>
                        kernel_5b;
            typedef     entropy_encoder_model_kernel_c<kernel_5b>
                        kernel_5b_c;

            typedef     entropy_encoder_model_kernel_5<alphabet_size,entropy_encoder,2500000,7>
                        kernel_5c;
            typedef     entropy_encoder_model_kernel_c<kernel_5c>
                        kernel_5c_c;

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

            // kernel_6
            typedef     entropy_encoder_model_kernel_6<alphabet_size,entropy_encoder>
                        kernel_6a;
            typedef     entropy_encoder_model_kernel_c<kernel_6a>
                        kernel_6a_c;

        };
    }

    #endif // DLIB_ENTROPY_ENCODER_MODEl_