Files
even-perfect-numbers-scanner/PerfectNumbers.Core/PartialFactorPendingEntry.cs
T

48 lines
1.3 KiB
C#

using System.Runtime.CompilerServices;
namespace PerfectNumbers.Core;
internal sealed class PartialFactorPendingEntry(ulong value, bool knownComposite)
{
[ThreadStatic]
private static PartialFactorPendingEntry? _poolHead;
private PartialFactorPendingEntry? _next;
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public static PartialFactorPendingEntry Rent(ulong value, bool knownComposite)
{
var poolHead = _poolHead;
if (poolHead == null)
{
return new(value, knownComposite);
}
_poolHead = poolHead._next;
poolHead.Value = value;
poolHead.KnownComposite = knownComposite;
poolHead.HasKnownPrimality = knownComposite;
poolHead.IsPrime = false;
return poolHead;
}
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public static void Return(PartialFactorPendingEntry entry)
{
entry._next = _poolHead;
_poolHead = entry;
}
public ulong Value = value;
public bool KnownComposite = knownComposite;
public bool HasKnownPrimality = knownComposite;
public bool IsPrime = false;
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public void WithPrimality(bool isPrime)
{
KnownComposite = KnownComposite || !isPrime;
HasKnownPrimality = true;
IsPrime = isPrime;
}
}