Mirror of Svelto.ECS because we're a fan of it
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

104 rindas
3.6KB

  1. using Svelto.DataStructures;
  2. using Svelto.DataStructures.Native;
  3. namespace Svelto.ECS
  4. {
  5. public struct LegacyGroupFilters
  6. {
  7. internal LegacyGroupFilters(SharedSveltoDictionaryNative<int, LegacyFilterGroup> legacyFilters, ExclusiveGroupStruct group)
  8. {
  9. this._legacyFilters = legacyFilters;
  10. _group = @group;
  11. }
  12. public ref LegacyFilterGroup GetFilter(int filterIndex)
  13. {
  14. #if DEBUG && !PROFILE_SVELTO
  15. if (_legacyFilters.isValid == false)
  16. throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}");
  17. if (_legacyFilters.ContainsKey(filterIndex) == false)
  18. throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}");
  19. #endif
  20. return ref _legacyFilters.GetValueByRef(filterIndex);
  21. }
  22. public bool HasFilter(int filterIndex) { return _legacyFilters.ContainsKey(filterIndex); }
  23. public void ClearFilter(int filterIndex)
  24. {
  25. if (_legacyFilters.TryFindIndex(filterIndex, out var index))
  26. _legacyFilters.GetValues(out _)[index].Clear();
  27. }
  28. public void ClearFilters()
  29. {
  30. foreach (var filter in _legacyFilters)
  31. filter.value.Clear();
  32. }
  33. public bool TryGetFilter(int filterIndex, out LegacyFilterGroup legacyFilter)
  34. {
  35. return _legacyFilters.TryGetValue(filterIndex, out legacyFilter);
  36. }
  37. public SveltoDictionaryKeyValueEnumerator<int, LegacyFilterGroup, NativeStrategy<SveltoDictionaryNode<int>>, NativeStrategy<LegacyFilterGroup>
  38. , NativeStrategy<int>> GetEnumerator()
  39. {
  40. return _legacyFilters.GetEnumerator();
  41. }
  42. //Note the following methods are internal because I was pondering the idea to be able to return
  43. //the list of LegacyGroupFilters linked to a specific filter ID. However this would mean to be able to
  44. //maintain a revers map which at this moment seems too much and also would need the following
  45. //method to be for ever internal (at this point in time I am not sure it's a good idea)
  46. internal void DisposeFilter(int filterIndex)
  47. {
  48. if (_legacyFilters.TryFindIndex(filterIndex, out var index))
  49. {
  50. ref var filterGroup = ref _legacyFilters.GetValues(out _)[index];
  51. filterGroup.Dispose();
  52. _legacyFilters.Remove(filterIndex);
  53. }
  54. }
  55. internal void DisposeFilters()
  56. {
  57. //must release the native buffers!
  58. foreach (var filter in _legacyFilters)
  59. filter.value.Dispose();
  60. _legacyFilters.FastClear();
  61. }
  62. internal ref LegacyFilterGroup CreateOrGetFilter(int filterID)
  63. {
  64. if (_legacyFilters.TryFindIndex(filterID, out var index) == false)
  65. {
  66. var orGetFilterForGroup = new LegacyFilterGroup(_group, filterID);
  67. _legacyFilters[filterID] = orGetFilterForGroup;
  68. return ref _legacyFilters.GetValueByRef(filterID);
  69. }
  70. return ref _legacyFilters.GetValues(out _)[index];
  71. }
  72. internal void Dispose()
  73. {
  74. foreach (var filter in _legacyFilters)
  75. {
  76. filter.value.Dispose();
  77. }
  78. _legacyFilters.Dispose();
  79. }
  80. readonly ExclusiveGroupStruct _group;
  81. //filterID, filter
  82. SharedSveltoDictionaryNative<int, LegacyFilterGroup> _legacyFilters;
  83. }
  84. }