diff --git a/1.2/Assemblies/1Fishery.dll b/1.2/Assemblies/1Fishery.dll index fb8a78a..f9df8dc 100644 Binary files a/1.2/Assemblies/1Fishery.dll and b/1.2/Assemblies/1Fishery.dll differ diff --git a/1.2/Assemblies/1Fishery.pdb b/1.2/Assemblies/1Fishery.pdb index 2311bc9..2406e76 100644 Binary files a/1.2/Assemblies/1Fishery.pdb and b/1.2/Assemblies/1Fishery.pdb differ diff --git a/1.3/Assemblies/1Fishery.dll b/1.3/Assemblies/1Fishery.dll index b710a1d..808892d 100644 Binary files a/1.3/Assemblies/1Fishery.dll and b/1.3/Assemblies/1Fishery.dll differ diff --git a/1.3/Assemblies/1Fishery.pdb b/1.3/Assemblies/1Fishery.pdb index 1149983..0a75ad6 100644 Binary files a/1.3/Assemblies/1Fishery.pdb and b/1.3/Assemblies/1Fishery.pdb differ diff --git a/1.4/Assemblies/1Fishery.dll b/1.4/Assemblies/1Fishery.dll index bbb3bb1..2ae2726 100644 Binary files a/1.4/Assemblies/1Fishery.dll and b/1.4/Assemblies/1Fishery.dll differ diff --git a/1.4/Assemblies/1Fishery.pdb b/1.4/Assemblies/1Fishery.pdb index fef27a7..107aa6e 100644 Binary files a/1.4/Assemblies/1Fishery.pdb and b/1.4/Assemblies/1Fishery.pdb differ diff --git a/1.5/Assemblies/1Fishery.dll b/1.5/Assemblies/1Fishery.dll index fb79dd2..e875424 100644 Binary files a/1.5/Assemblies/1Fishery.dll and b/1.5/Assemblies/1Fishery.dll differ diff --git a/1.5/Assemblies/1Fishery.pdb b/1.5/Assemblies/1Fishery.pdb index d1e75e1..d5e6082 100644 Binary files a/1.5/Assemblies/1Fishery.pdb and b/1.5/Assemblies/1Fishery.pdb differ diff --git a/Source/FisheryLib/Collections/FishSet.cs b/Source/FisheryLib/Collections/FishSet.cs index 778b2f4..8eeb181 100644 --- a/Source/FisheryLib/Collections/FishSet.cs +++ b/Source/FisheryLib/Collections/FishSet.cs @@ -149,6 +149,21 @@ public class FishSet : ISet, IReadOnlyCollection, ICollection Initialize(minimumCapacity); } + public unsafe FishSet(int minimumCapacity, delegate* hashCodeGetter = default, + delegate* equalityComparer = default) + { + InitializeDelegates(hashCodeGetter, equalityComparer); + Initialize(minimumCapacity); + } + + public unsafe FishSet(int minimumCapacity, T defaultValue, delegate* hashCodeGetter = default, + delegate* equalityComparer = default) + { + _defaultValue = defaultValue; + InitializeDelegates(hashCodeGetter, equalityComparer); + Initialize(minimumCapacity); + } + [MemberNotNull(nameof(_buckets))] [MemberNotNull(nameof(_tails))] private void Initialize(int minimumCapacity = 0) @@ -163,6 +178,15 @@ public class FishSet : ISet, IReadOnlyCollection, ICollection _wrapAroundMask = _buckets.Length - 1; } + private unsafe void InitializeDelegates(delegate* hashCodeGetter, delegate* equalityComparer) + { + if (hashCodeGetter != default) + _hashCodeGetter = hashCodeGetter; + + if (equalityComparer != default) + _equalityComparer = equalityComparer; + } + public FishSet(IEnumerable entries) : this(0) { foreach (var entry in entries) diff --git a/Source/FisheryLib/Collections/FishTable.cs b/Source/FisheryLib/Collections/FishTable.cs index 12a8b40..8c956ed 100644 --- a/Source/FisheryLib/Collections/FishTable.cs +++ b/Source/FisheryLib/Collections/FishTable.cs @@ -258,6 +258,25 @@ public class FishTable : IDictionary, IDictionary, I Initialize(minimumCapacity); } + public unsafe FishTable(int minimumCapacity, delegate* keyHashCodeByRefGetter = default, + delegate* keyHashCodeGetter = default, + delegate* keyEqualityByRefComparer = default, + delegate* keyEqualityComparer = default) + { + InitializeDelegates(keyHashCodeByRefGetter, keyHashCodeGetter, keyEqualityByRefComparer, keyEqualityComparer); + Initialize(minimumCapacity); + } + + public unsafe FishTable(int minimumCapacity, TKey defaultKey, + delegate* keyHashCodeByRefGetter = default, delegate* keyHashCodeGetter = default, + delegate* keyEqualityByRefComparer = default, + delegate* keyEqualityComparer = default) + { + _defaultEntry.Key = defaultKey; + InitializeDelegates(keyHashCodeByRefGetter, keyHashCodeGetter, keyEqualityByRefComparer, keyEqualityComparer); + Initialize(minimumCapacity); + } + [MemberNotNull(nameof(_buckets))] [MemberNotNull(nameof(_tails))] private void Initialize(int minimumCapacity = 0) @@ -272,6 +291,23 @@ public class FishTable : IDictionary, IDictionary, I _wrapAroundMask = _buckets.Length - 1; } + private unsafe void InitializeDelegates(delegate* keyHashCodeByRefGetter, + delegate* keyHashCodeGetter, delegate* keyEqualityByRefComparer, + delegate* keyEqualityComparer) + { + if (keyHashCodeByRefGetter != default) + _keyHashCodeByRefGetter = keyHashCodeByRefGetter; + + if (keyHashCodeGetter != default) + _keyHashCodeGetter = keyHashCodeGetter; + + if (keyEqualityByRefComparer != default) + _keyEqualityByRefComparer = keyEqualityByRefComparer; + + if (keyEqualityComparer != default) + _keyEqualityComparer = keyEqualityComparer; + } + public FishTable(IEnumerable> entries) : this(0) => AddRange(entries); diff --git a/Source/FisheryLib/Collections/IndexedFishSet.cs b/Source/FisheryLib/Collections/IndexedFishSet.cs index 9d1b106..58b37e4 100644 --- a/Source/FisheryLib/Collections/IndexedFishSet.cs +++ b/Source/FisheryLib/Collections/IndexedFishSet.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; namespace FisheryLib.Collections; @@ -17,10 +18,11 @@ namespace FisheryLib.Collections; public class IndexedFishSet : IList, IList, IReadOnlyList { private readonly List _items = []; - private readonly FishTable _indices = new(); + private readonly FishTable _indices; public T this[int index] { + [MethodImpl(MethodImplOptions.AggressiveInlining)] get => _items[index]; set { @@ -31,7 +33,23 @@ public class IndexedFishSet : IList, IList, IReadOnlyList } } - public List ReadOnlyList => _items; + public List ReadOnlyList + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _items; + } + + public ReadOnlySpan Span + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => _items.AsReadOnlySpan(); + } + + public IndexedFishSet() : this(static () => []) + { + } + + public IndexedFishSet(Func> indicesInitializer) => _indices = indicesInitializer(); public List.Enumerator GetEnumerator() => _items.GetEnumerator(); diff --git a/Source/FisheryLib/Fishery.cs b/Source/FisheryLib/Fishery.cs index 74126ab..0cf57d2 100644 --- a/Source/FisheryLib/Fishery.cs +++ b/Source/FisheryLib/Fishery.cs @@ -29,11 +29,11 @@ namespace FisheryLib; [PublicAPI] public static class FisheryLib { - public const decimal VERSION = 0.6M; + public const decimal VERSION = 0.61M; public static decimal CurrentlyLoadedVersion { get; } = VERSION; - public const string VERSION_STRING = "0.6"; + public const string VERSION_STRING = "0.6.1"; // public static string GetVersion() // {