// ReSharper disable RedundantUsingDirective
using System;
using JetBrains.Annotations;
using Terminal.Gui.Analyzers.Internal.Compatibility;
namespace Terminal.Gui.Analyzers.Internal.Attributes;
///
/// Designates an enum member for inclusion in generation of bitwise combinations with other members decorated with
/// this attribute which have the same value.
///
///
///
/// This attribute is only considered for enum types with the .
///
///
[AttributeUsage (AttributeTargets.Enum)]
[UsedImplicitly]
public sealed class GenerateEnumMemberCombinationsAttribute : System.Attribute
{
private const byte MaximumPopCountLimit = 14;
private uint _mask;
private uint _maskPopCount;
private byte _popCountLimit = 8;
///
public string GroupTag { get; set; }
///
/// The mask for the group defined in
///
public uint Mask
{
get => _mask;
set
{
#if NET8_0_OR_GREATER
_maskPopCount = uint.PopCount (value);
#else
_maskPopCount = value.GetPopCount ();
#endif
PopCountLimitExceeded = _maskPopCount > PopCountLimit;
MaximumPopCountLimitExceeded = _maskPopCount > MaximumPopCountLimit;
if (PopCountLimitExceeded || MaximumPopCountLimitExceeded)
{
return;
}
_mask = value;
}
}
///
/// The maximum number of bits allowed to be set to 1 in .
///
///
///
/// Default: 8 (256 possible combinations)
///
///
/// Increasing this value is not recommended!
/// Decreasing this value is pointless unless you want to limit maximum possible generated combinations even
/// further.
///
///
/// If the result of () exceeds 2 ^
/// , no
/// combinations will be generated for the members which otherwise would have been included by .
/// Values exceeding the actual population count of have no effect.
///
///
/// This option is set to a sane default of 8, but also has a hard-coded limit of 14 (16384 combinations), as a
/// protection against generation of extremely large files.
///
///
/// CAUTION: The maximum number of possible combinations possible is equal to 1 <<
/// ().
/// See for hard-coded limit,
///
///
public byte PopCountLimit
{
get => _popCountLimit;
set
{
#if NET8_0_OR_GREATER
_maskPopCount = uint.PopCount (_mask);
#else
_maskPopCount = _mask.GetPopCount ();
#endif
PopCountLimitExceeded = _maskPopCount > value;
MaximumPopCountLimitExceeded = _maskPopCount > MaximumPopCountLimit;
if (PopCountLimitExceeded || MaximumPopCountLimitExceeded)
{
return;
}
_mask = value;
_popCountLimit = value;
}
}
[UsedImplicitly]
internal bool MaximumPopCountLimitExceeded { get; private set; }
[UsedImplicitly]
internal bool PopCountLimitExceeded { get; private set; }
}