aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs')
-rw-r--r--Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs78
1 files changed, 78 insertions, 0 deletions
diff --git a/Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs b/Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs
new file mode 100644
index 00000000..f0a339df
--- /dev/null
+++ b/Ryujinx.Core/OsHle/Utilities/IdPoolWithObj.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+
+namespace Ryujinx.Core.OsHle.Utilities
+{
+ class IdPoolWithObj : IEnumerable<KeyValuePair<int, object>>
+ {
+ private IdPool Ids;
+
+ private ConcurrentDictionary<int, object> Objs;
+
+ public IdPoolWithObj()
+ {
+ Ids = new IdPool();
+
+ Objs = new ConcurrentDictionary<int, object>();
+ }
+
+ 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<T>(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<KeyValuePair<int, object>> IEnumerable<KeyValuePair<int, object>>.GetEnumerator()
+ {
+ return Objs.GetEnumerator();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return Objs.GetEnumerator();
+ }
+ }
+} \ No newline at end of file