using System; using Svelto.ECS.Internal; namespace Svelto.ECS { public interface IEntityViewBuilder { void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView); ITypeSafeList Preallocate(ref ITypeSafeList list, int size); Type GetEntityViewType(); void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList); } public class EntityViewBuilder : IEntityViewBuilder where EntityViewType : EntityView, new() { public void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView) { if (list == null) list = new TypeSafeFasterListForECSForClasses(); var castedList = list as TypeSafeFasterListForECSForClasses; var lentityView = EntityView.BuildEntityView(entityID); castedList.Add(lentityView); entityView = lentityView; } public ITypeSafeList Preallocate(ref ITypeSafeList list, int size) { if (list == null) list = new TypeSafeFasterListForECSForClasses(size); else list.ReserveCapacity(size); return list; } public Type GetEntityViewType() { return _entityViewType; } public void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList) { var fromCastedList = fromSafeList as TypeSafeFasterListForECSForClasses; var toCastedList = toSafeList as TypeSafeFasterListForECSForClasses; toCastedList.Add(fromCastedList[entityID]); } readonly Type _entityViewType = typeof(EntityViewType); } public class EntityStructBuilder : IEntityViewBuilder where EntityViewType : struct, IEntityStruct { public void BuildEntityViewAndAddToList(ref ITypeSafeList list, int entityID, out IEntityView entityView) { var lentityView = default(EntityViewType); lentityView.ID = entityID; if (list == null) list = new TypeSafeFasterListForECSForStructs(); var castedList = list as TypeSafeFasterListForECSForStructs; castedList.Add(lentityView); entityView = null; } public ITypeSafeList Preallocate(ref ITypeSafeList list, int size) { if (list == null) list = new TypeSafeFasterListForECSForStructs(size); else list.ReserveCapacity(size); return list; } public Type GetEntityViewType() { return _entityViewType; } public void MoveEntityView(int entityID, ITypeSafeList fromSafeList, ITypeSafeList toSafeList) { var fromCastedList = fromSafeList as TypeSafeFasterListForECSForStructs; var toCastedList = toSafeList as TypeSafeFasterListForECSForStructs; toCastedList.Add(fromCastedList[entityID]); } readonly Type _entityViewType = typeof(EntityViewType); } }