using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; namespace Ryujinx.Core.OsHle.Utilities { class IdPoolWithObj : IEnumerable> { private IdPool Ids; private ConcurrentDictionary Objs; public IdPoolWithObj() { Ids = new IdPool(); Objs = new ConcurrentDictionary(); } public int GenerateId(object Data) { int Id = Ids.GenerateId(); if (Id == -1 || !Objs.TryAdd(Id, Data)) { throw new InvalidOperationException(); } return Id; } public bool ReplaceData(int Id, object Data) { if (Objs.ContainsKey(Id)) { Objs[Id] = Data; return true; } return false; } public T GetData(int Id) { if (Objs.TryGetValue(Id, out object Data) && Data is T) { return (T)Data; } return default(T); } public void Delete(int Id) { if (Objs.TryRemove(Id, out object Obj)) { if (Obj is IDisposable DisposableObj) { DisposableObj.Dispose(); } Ids.DeleteId(Id); } } IEnumerator> IEnumerable>.GetEnumerator() { return Objs.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return Objs.GetEnumerator(); } } }