using System.Threading; using Svelto.Common; using Svelto.DataStructures; using Svelto.ECS.DataStructures; namespace Svelto.ECS { public class GlobalTypeID { internal static uint NextID() { return (uint) (Interlocked.Increment(ref value) - 1); } static GlobalTypeID() { value = 0; } static int value; } interface IFiller { void FillFromByteArray(EntityInitializer init, NativeBag buffer); } class Filler : IFiller where T : struct, IEntityComponent { static Filler() { DBC.ECS.Check.Require(TypeCache.isUnmanaged == true, "invalid type used"); } //it's an internal interface public void FillFromByteArray(EntityInitializer init, NativeBag buffer) { var component = buffer.Dequeue(); init.Init(component); } } static class EntityComponentID { #if UNITY_NATIVE internal static readonly Unity.Burst.SharedStatic ID = Unity.Burst.SharedStatic.GetOrCreate(); #else internal struct SharedStatic { public uint Data; } internal static SharedStatic ID; #endif } static class EntityComponentIDMap { static readonly FasterList TYPE_IDS; static EntityComponentIDMap() { TYPE_IDS = new FasterList(); } internal static void Register(IFiller entityBuilder) where T : struct, IEntityComponent { var location = EntityComponentID.ID.Data = GlobalTypeID.NextID(); TYPE_IDS.AddAt(location, entityBuilder); } internal static IFiller GetTypeFromID(uint typeId) { return TYPE_IDS[typeId]; } } }