using System; using System.Collections.Generic; using System.Reflection; using Svelto.DataStructures; using Svelto.Utilities; namespace Svelto.ECS { public interface IEntityView { int ID { get; } } public interface IEntityStruct:IEntityView { new int ID { set; } } public abstract class EntityView : IEntityView { public int ID { get { return _ID; } } abstract internal KeyValuePair>[] EntityViewBlazingFastReflection(out int count); protected int _ID; } public class EntityView: EntityView where T: EntityView { internal static TEntityViewType BuildEntityView(int ID) where TEntityViewType: EntityView, new() { if (FieldCache.list.Count == 0) { var type = typeof(TEntityViewType); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance); for (int i = fields.Length - 1; i >= 0; --i) { var field = fields[i]; Action setter = FastInvoke.MakeSetter(field); FieldCache.Add(new KeyValuePair>(field.FieldType, setter)); } } return new TEntityViewType { _ID = ID }; } override internal KeyValuePair>[] EntityViewBlazingFastReflection(out int count) { return FasterList>>.NoVirt.ToArrayFast(FieldCache.list, out count); } static class FieldCache { internal static void Add(KeyValuePair> setter) { list.Add(setter); } internal static readonly FasterList>> list = new FasterList>>(); } } }