CacheByRange.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Ryujinx.Graphics.Vulkan
  4. {
  5. struct CacheByRange<T> where T : IDisposable
  6. {
  7. private Dictionary<ulong, T> _ranges;
  8. public void Add(int offset, int size, T value)
  9. {
  10. EnsureInitialized();
  11. _ranges.Add(PackRange(offset, size), value);
  12. }
  13. public bool TryGetValue(int offset, int size, out T value)
  14. {
  15. EnsureInitialized();
  16. return _ranges.TryGetValue(PackRange(offset, size), out value);
  17. }
  18. public void Clear()
  19. {
  20. if (_ranges != null)
  21. {
  22. foreach (T value in _ranges.Values)
  23. {
  24. value.Dispose();
  25. }
  26. _ranges.Clear();
  27. _ranges = null;
  28. }
  29. }
  30. private void EnsureInitialized()
  31. {
  32. if (_ranges == null)
  33. {
  34. _ranges = new Dictionary<ulong, T>();
  35. }
  36. }
  37. private static ulong PackRange(int offset, int size)
  38. {
  39. return (uint)offset | ((ulong)size << 32);
  40. }
  41. public void Dispose()
  42. {
  43. Clear();
  44. }
  45. }
  46. }