using System; namespace MemoryPools.Collections.Specialized { /// /// Represents ideal dictionary with extra fast access to its items. Items should inherit IdealHashObjectBase to be /// able to set hashcode. /// /// Key of dictionary /// Corresponding Value public class IdealHashDictionary : IDisposable where TK : IdealHashObjectBase where TV : class { readonly PoolingListCanon _list = Pool>.Get().Init(); readonly PoolingQueue _freeNodes = new PoolingQueueVal(); public TV this[TK key] { get { var hc = key.IdealHashCode; if(hc >= _list.Count) throw new ArgumentOutOfRangeException(nameof(key)); return _list[hc]; } } public void Add(TK key, TV value) { var index = AcquireHashCode(value); key.IdealHashCode = index; } public bool Remove(TK key) { var index = key.IdealHashCode; _freeNodes.Enqueue(index); _list[index] = default; return true; } private int AcquireHashCode(TV value) { if(_freeNodes.Count > 0) { return _freeNodes.Dequeue(); } _list.Add(value); return _list.Count - 1; } public void Dispose() { _list.Clear(); _freeNodes.Clear(); } } }