//-----------------------------------------------------------------//
 // Construtor para um Controlador só com Política de Mapeamento
 // Direto.
 public MemoryController(MemoryCache cache, AP_Directo policy)
 {
     Cache      = cache;
     nCounter   = nHit = nMiss = 0;
     APolicy    = policy;
     RAlgorithm = null;
 }
        //-----------------------------------------------------------------//
        // Construtor para um Controlador que pode conter uma Política
        // de Mapeamentos (Associativo ou Por Conjunto) e algum Algoritmo de
        // Substituição.
        public MemoryController(MemoryCache cache, AssignmentPolicy policy, ReplacementAlgorithm replace)
        {
            Cache      = cache;
            APolicy    = policy;
            RAlgorithm = replace;
            nCounter   = nHit = nMiss = 0;

            if (APolicy is AP_PorConjunto)
            {
                cache.setTabularRepresentation(true);
                RAlgorithm.setTabularRepresentation(true);
            }
        }
        //-----------------------------------------------------------------------------//
        // Constrói um controlador de memória segundo a configuração carregada desde
        // o arquivo <setting.ini>
        static MemoryController BuildMemoryController(int size, AssignmentPolicyType mapping, ReplacementAlgorithmType replacing = 0)
        {
            MemoryCache          memory     = new MemoryCache(size);
            AssignmentPolicy     assignment = null;
            ReplacementAlgorithm replace    = null;

            if (mapping == AssignmentPolicyType.Direto)
            {
                return(new MemoryController(memory, new AP_Directo(size)));
            }
            else
            {
                // Dependendo da configuração, crio a Política de Mapeamento necessária.
                switch (mapping)
                {
                case AssignmentPolicyType.Associativo: assignment = new AP_Associativa(size); break;

                case AssignmentPolicyType.PorConjunto: assignment = new AP_PorConjunto(size); break;
                }

                // Dependendo da configuração, crio o Algoritmo de Substituição necessário.
                switch (replacing)
                {
                case ReplacementAlgorithmType.Fifo: replace = new RA_FIFO(size); break;

                case ReplacementAlgorithmType.Lfu: replace = new RA_LFU(size); break;

                case ReplacementAlgorithmType.Lru: replace = new RA_LRU(size); break;

                case ReplacementAlgorithmType.Mru: replace = new RA_MRU(size); break;

                case ReplacementAlgorithmType.Random: replace = new RA_RANDOM(size); break;
                }
            }

            return(new MemoryController(memory, assignment, replace));
        }