using System;
using System.Collections.Generic;
namespace Svelto.ECS
{
///
/// Entities are always built in group. Where the group is not specificed, a special standard group is used
/// ID can be reused within groups
/// an EnginesRoot reference cannot be held by anything else than the Composition Root
/// where it has been created. IEntityFactory and IEntityFunctions allow a weakreference
/// of the EnginesRoot to be passed around.
///
/// ExclusiveGroups must be used in your game like:
/// static class GameExclusiveGroup
///{
/// public static readonly ExclusiveGroups PlayerEntitiesGroup = new ExclusiveGroups();
///}
///
///
public interface IEntityFactory
{
///
/// where performance is critical, you may wish to pre allocate the space needed
/// to store the entities
///
///
///
///
void PreallocateEntitySpace(ExclusiveGroupStruct groupStructId, uint size)
where T : IEntityDescriptor, new();
///
/// The EntityDescriptor doesn't need to be ever instantiated. It just describes the Entity
/// itself in terms of EntityComponents to build. The Implementors are passed to fill the
/// references of the EntityComponents components. Please read the articles on my blog
/// to understand better the terminologies
/// Using this function is like building a normal entity, but the entity components
/// are grouped by groupID to be more efficiently processed inside engines and
/// improve cache locality. Either class entityComponents and struct entityComponents can be
/// grouped.
///
///
///
///
///
EntityComponentInitializer BuildEntity(uint entityID, BuildGroup groupStructId,
IEnumerable