31 lines
815 B
C#
31 lines
815 B
C#
using System.Runtime.CompilerServices;
|
|
using System.Threading;
|
|
using EvenPerfectBitScanner.Candidates;
|
|
|
|
namespace EvenPerfectBitScanner.Candidates.Transforms;
|
|
|
|
internal static class CandidateAddTransform
|
|
{
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
internal static ulong Transform(ulong value, ref ulong remainder, ref bool limitReached)
|
|
{
|
|
ulong next = value;
|
|
ulong diff = remainder.GetNextAddDiff();
|
|
|
|
if (next > ulong.MaxValue - diff)
|
|
{
|
|
Volatile.Write(ref limitReached, true);
|
|
return next;
|
|
}
|
|
|
|
remainder += diff;
|
|
// Retain direct modulo because the Mod6 helper underperforms on 64-bit operands.
|
|
while (remainder >= 6UL)
|
|
{
|
|
remainder -= 6UL;
|
|
}
|
|
|
|
return next + diff;
|
|
}
|
|
}
|