// 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; } }