Exemplo n.º 1
0
        private void RemoveNode(LFUCacheBucket node)
        {
            if (head == node)
            {
                head = node.NextBucket;
            }
            else
            {
                node.PrevBucket.NextBucket = node.NextBucket;
            }

            if (node.NextBucket != null)
            {
                node.NextBucket.PrevBucket = node.PrevBucket;
            }
        }
Exemplo n.º 2
0
        private void IncreaseAccessCount(int key)
        {
            LFUCacheBucket node = keyNodeDict[key];

            node.Keys.Remove(key);

            if (node.NextBucket == null)
            {
                LFUCacheBucket temp = new LFUCacheBucket(node.AccessCount + 1);
                temp.Keys.Add(key);
                temp.PrevBucket  = node;
                node.NextBucket  = temp;
                keyNodeDict[key] = temp;
            }
            else if (node.NextBucket.AccessCount == node.AccessCount + 1)
            {
                node.NextBucket.Keys.Add(key);
                keyNodeDict[key] = node.NextBucket;
            }
            else
            {
                LFUCacheBucket temp = new LFUCacheBucket(node.AccessCount + 1);
                temp.Keys.Add(key);
                temp.NextBucket = node.NextBucket;
                if (node.NextBucket != null)
                {
                    node.NextBucket.PrevBucket = temp;
                }

                node.NextBucket = temp;
                temp.PrevBucket = node;

                keyNodeDict[key] = temp;
            }

            if (!node.Keys.Any())
            {
                this.RemoveNode(node);
            }
        }
Exemplo n.º 3
0
        private void AddNewKeyToNode(int key)
        {
            if (head == null)
            {
                head = new LFUCacheBucket();
                head.Keys.Add(key);
            }
            else if (head.AccessCount == 0)
            {
                head.Keys.Add(key);
            }
            else
            {
                LFUCacheBucket node = new LFUCacheBucket();
                node.Keys.Add(key);
                head.PrevBucket = node;
                node.NextBucket = head;
                head            = node;
            }

            keyNodeDict[key] = head;
        }