fix(core): Adds ability to store null value in ordered hash set (#447)
- [X] Adds the ability to store a null value in an ordered hash set TODO: Optimized the OrderedHashSet. See this: * https://github.com/dotnet/runtime/issues/10050 Looks like the OrderedDictionary that I based this structure from was not updated. See the source for diffing: https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/HashSet.cs Difference between a HashSet and an OrderedHashSet is updating the indexes of the entries after fixing the chain to preserve insertion order.
This commit is contained in:
parent
3664149422
commit
995149ad01
3 changed files with 75 additions and 21 deletions
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace Microsoft.Collections.Extensions
|
||||
{
|
||||
|
|
@ -98,5 +99,27 @@ namespace Microsoft.Collections.Extensions
|
|||
|
||||
return GetPrime(newSize);
|
||||
}
|
||||
|
||||
/// <summary>Returns approximate reciprocal of the divisor: ceil(2**64 / divisor).</summary>
|
||||
/// <remarks>This should only be used on 64-bit.</remarks>
|
||||
public static ulong GetFastModMultiplier(uint divisor) =>
|
||||
ulong.MaxValue / divisor + 1;
|
||||
|
||||
/// <summary>Performs a mod operation using the multiplier pre-computed with <see cref="GetFastModMultiplier"/>.</summary>
|
||||
/// <remarks>This should only be used on 64-bit.</remarks>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static uint FastMod(uint value, uint divisor, ulong multiplier)
|
||||
{
|
||||
// We use modified Daniel Lemire's fastmod algorithm (https://github.com/dotnet/runtime/pull/406),
|
||||
// which allows to avoid the long multiplication if the divisor is less than 2**31.
|
||||
Debug.Assert(divisor <= int.MaxValue);
|
||||
|
||||
// This is equivalent of (uint)Math.BigMul(multiplier * value, divisor, out _). This version
|
||||
// is faster than BigMul currently because we only need the high bits.
|
||||
uint highbits = (uint)(((((multiplier * value) >> 32) + 1) * divisor) >> 32);
|
||||
|
||||
Debug.Assert(highbits == value % divisor);
|
||||
return highbits;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue