using Svelto.DataStructures; using Svelto.DataStructures.Native; namespace Svelto.ECS { public struct LegacyGroupFilters { internal LegacyGroupFilters(SharedSveltoDictionaryNative legacyFilters, ExclusiveGroupStruct group) { this._legacyFilters = legacyFilters; _group = @group; } public ref LegacyFilterGroup GetFilter(int filterIndex) { #if DEBUG && !PROFILE_SVELTO if (_legacyFilters.isValid == false) throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}"); if (_legacyFilters.ContainsKey(filterIndex) == false) throw new ECSException($"trying to fetch not existing filters {filterIndex} group {_group.ToName()}"); #endif return ref _legacyFilters.GetValueByRef(filterIndex); } public bool HasFilter(int filterIndex) { return _legacyFilters.ContainsKey(filterIndex); } public void ClearFilter(int filterIndex) { if (_legacyFilters.TryFindIndex(filterIndex, out var index)) _legacyFilters.GetValues(out _)[index].Clear(); } public void ClearFilters() { foreach (var filter in _legacyFilters) filter.value.Clear(); } public bool TryGetFilter(int filterIndex, out LegacyFilterGroup legacyFilter) { return _legacyFilters.TryGetValue(filterIndex, out legacyFilter); } public SveltoDictionaryKeyValueEnumerator>, NativeStrategy , NativeStrategy> GetEnumerator() { return _legacyFilters.GetEnumerator(); } //Note the following methods are internal because I was pondering the idea to be able to return //the list of LegacyGroupFilters linked to a specific filter ID. However this would mean to be able to //maintain a revers map which at this moment seems too much and also would need the following //method to be for ever internal (at this point in time I am not sure it's a good idea) internal void DisposeFilter(int filterIndex) { if (_legacyFilters.TryFindIndex(filterIndex, out var index)) { ref var filterGroup = ref _legacyFilters.GetValues(out _)[index]; filterGroup.Dispose(); _legacyFilters.Remove(filterIndex); } } internal void DisposeFilters() { //must release the native buffers! foreach (var filter in _legacyFilters) filter.value.Dispose(); _legacyFilters.FastClear(); } internal ref LegacyFilterGroup CreateOrGetFilter(int filterID) { if (_legacyFilters.TryFindIndex(filterID, out var index) == false) { var orGetFilterForGroup = new LegacyFilterGroup(_group, filterID); _legacyFilters[filterID] = orGetFilterForGroup; return ref _legacyFilters.GetValueByRef(filterID); } return ref _legacyFilters.GetValues(out _)[index]; } internal void Dispose() { foreach (var filter in _legacyFilters) { filter.value.Dispose(); } _legacyFilters.Dispose(); } readonly ExclusiveGroupStruct _group; //filterID, filter SharedSveltoDictionaryNative _legacyFilters; } }