namespace GMap.NET.Internals { using System.Collections.Generic; using System.IO; using System; /// /// kiber speed memory cache for tiles with history support ;} /// internal class KiberTileCache : Dictionary { readonly Queue Queue = new Queue(); /// /// the amount of tiles in MB to keep in memmory, default: 22MB, if each ~100Kb it's ~222 tiles /// #if !PocketPC public int MemoryCacheCapacity = 22; #else public int MemoryCacheCapacity = 3; #endif long memoryCacheSize = 0; /// /// current memmory cache size in MB /// public double MemoryCacheSize { get { return memoryCacheSize / 1048576.0; } } public new void Add(RawTile key, byte[] value) { Queue.Enqueue(key); base.Add(key, value); memoryCacheSize += value.Length; } // do not allow directly removal of elements private new void Remove(RawTile key) { } public new void Clear() { Queue.Clear(); base.Clear(); } internal void RemoveMemoryOverload() { while(MemoryCacheSize > MemoryCacheCapacity) { if(Keys.Count > 0 && Queue.Count > 0) { RawTile first = Queue.Dequeue(); try { var m = base[first]; { base.Remove(first); memoryCacheSize -= m.Length; } m = null; } catch { } } else { break; } } } } }