using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; using NativeCollection.UnsafeType; namespace NativeCollection { public unsafe class MultiMap : IEnumerable>, INativeCollectionClass where T : unmanaged, IEquatable, IComparable where K : unmanaged, IEquatable { private UnsafeType.MultiMap* _multiMap; private const int _defaultPoolSize = 200; public MultiMap(int maxPoolSize = _defaultPoolSize) { _multiMap = UnsafeType.MultiMap.Create(maxPoolSize); IsDisposed = false; } public Span this[T key] => (*_multiMap)[key]; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Add(T key, K value) { _multiMap->Add(key,value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Remove(T key, K value) { return _multiMap->Remove(key, value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Remove(T key) { return _multiMap->Remove(key); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Clear() { _multiMap->Clear(); } public int Count => _multiMap->Count; IEnumerator> IEnumerable>. GetEnumerator() { return GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public UnsafeType.SortedSet>.Enumerator GetEnumerator() { return _multiMap->GetEnumerator(); } public void Dispose() { if (IsDisposed) { return; } if (_multiMap!=null) { _multiMap->Dispose(); NativeMemoryHelper.Free(_multiMap); GC.RemoveMemoryPressure(Unsafe.SizeOf>()); IsDisposed = true; } } public void ReInit() { if (IsDisposed) { _multiMap = UnsafeType.MultiMap.Create(_defaultPoolSize); IsDisposed = false; } } public bool IsDisposed { get; private set; } ~MultiMap() { Dispose(); } } }