CrabUI
Loading...
Searching...
No Matches
WeakCatalog.cs
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Reflection;
5
6using Barotrauma;
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Input;
9using Microsoft.Xna.Framework.Graphics;
10using System.Runtime.CompilerServices;
11
12namespace CrabUI
13{
14
15 public class WeakCatalog<TKey, TValue> where TValue : class
16 {
17 public Dictionary<TKey, List<WeakReference<TValue>>> Pages = new();
18
19 public Dictionary<TKey, List<WeakReference<TValue>>>.KeyCollection Keys => Pages.Keys;
20
21 public void Add(TKey key, TValue value)
22 {
23 if (!Pages.ContainsKey(key)) Pages[key] = new();
24 Pages[key].Add(new WeakReference<TValue>(value));
25 }
26
27 public void Clear() => Pages.Clear();
28
29 public void RemoveEmptyLinks(TKey key)
30 {
31 if (!Pages.ContainsKey(key))
32 {
33 Pages[key] = new();
34 return;
35 }
36
37 Pages[key] = Pages[key].Where(wr =>
38 {
39 TValue value = null;
40 wr.TryGetTarget(out value);
41 return value is not null;
42 }).ToList();
43 }
44
45 public IEnumerable<TValue> GetPage(TKey key)
46 {
47 RemoveEmptyLinks(key);
48 return Pages[key].Select(wr =>
49 {
50 TValue value = null;
51 wr.TryGetTarget(out value);
52 return value;
53 });
54 }
55 }
56}