using System; using System.Collections.Generic; using System.Runtime.CompilerServices; #pragma warning disable 660,661 namespace Svelto.ECS { /// /// Exclusive Groups guarantee that the GroupID is unique. /// /// The best way to use it is like: /// /// public static class MyExclusiveGroups //(can be as many as you want) /// { /// public static ExclusiveGroup MyExclusiveGroup1 = new ExclusiveGroup(); /// /// public static ExclusiveGroup[] GroupOfGroups = { MyExclusiveGroup1, ...}; //for each on this! /// } /// ///To debug it use in your debug window: Svelto.ECS.Debugger.EGID.GetGroupNameFromId(groupID) public sealed class ExclusiveGroup { public const uint MaxNumberOfExclusiveGroups = 2 << 20; public ExclusiveGroup(ExclusiveGroupBitmask bitmask = 0) { _group = ExclusiveGroupStruct.Generate((byte) bitmask); } public ExclusiveGroup(string recognizeAs, ExclusiveGroupBitmask bitmask = 0) { _group = ExclusiveGroupStruct.Generate((byte) bitmask); _knownGroups.Add(recognizeAs, _group); } public ExclusiveGroup(ushort range) { _group = new ExclusiveGroupStruct(range); #if DEBUG _range = range; #endif } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Disable() { _group.Disable(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enable() { _group.Enable(); } public static implicit operator ExclusiveGroupStruct(ExclusiveGroup group) { return group._group; } public static explicit operator uint(ExclusiveGroup group) { return (uint) @group._group; } public static ExclusiveGroupStruct operator +(ExclusiveGroup a, uint b) { #if DEBUG if (a._range == 0) throw new ECSException($"Adding values to a not ranged ExclusiveGroup: {(uint) a}"); if (b >= a._range) throw new ECSException($"Using out of range group: {(uint) a} + {b}"); #endif return a._group + b; } //todo document the use case for this method public static ExclusiveGroupStruct Search(string holderGroupName) { if (_knownGroups.ContainsKey(holderGroupName) == false) throw new Exception("Named Group Not Found ".FastConcat(holderGroupName)); return _knownGroups[holderGroupName]; } public override string ToString() { return _group.ToString(); } static readonly Dictionary _knownGroups = new Dictionary(); #if DEBUG readonly ushort _range; #endif ExclusiveGroupStruct _group; } }