package com.artemis;
import java.util.BitSet;
import com.artemis.utils.Bag;
public class EntityManager extends Manager {
private Bag<Entity> entities;
private BitSet disabled;
private int active;
private long added;
private long created;
private long deleted;
private IdentifierPool identifierPool;
public EntityManager() {
entities = new Bag<Entity>();
disabled = new BitSet();
identifierPool = new IdentifierPool();
}
@Override
protected void initialize() {
}
protected Entity createEntityInstance() {
Entity e = new Entity(world, identifierPool.checkOut());
created++;
return e;
}
@Override
public void added(Entity e) {
active++;
added++;
entities.set(e.getId(), e);
}
@Override
public void enabled(Entity e) {
disabled.clear(e.getId());
}
@Override
public void disabled(Entity e) {
disabled.set(e.getId());
}
@Override
public void deleted(Entity e) {
entities.set(e.getId(), null);
disabled.clear(e.getId());
identifierPool.checkIn(e.getId());
active--;
deleted++;
}
/**
* Check if this entity is active.
* Active means the entity is being actively processed.
*
* @param entityId
* @return true if active, false if not.
*/
public boolean isActive(int entityId) {
return entities.get(entityId) != null;
}
/**
* Check if the specified entityId is enabled.
*
* @param entityId
* @return true if the entity is enabled, false if it is disabled.
*/
public boolean isEnabled(int entityId) {
return !disabled.get(entityId);
}
/**
* Get a entity with this id.
*
* @param entityId
* @return the entity
*/
protected Entity getEntity(int entityId) {
return entities.get(entityId);
}
/**
* Get how many entities are active in this world.
* @return how many entities are currently active.
*/
public int getActiveEntityCount() {
return active;
}
/**
* Get how many entities have been created in the world since start.
* Note: A created entity may not have been added to the world, thus
* created count is always equal or larger than added count.
* @return how many entities have been created since start.
*/
public long getTotalCreated() {
return created;
}
/**
* Get how many entities have been added to the world since start.
* @return how many entities have been added.
*/
public long getTotalAdded() {
return added;
}
/**
* Get how many entities have been deleted from the world since start.
* @return how many entities have been deleted since start.
*/
public long getTotalDeleted() {
return deleted;
}
/*
* Used only internally to generate distinct ids for entities and reuse them.
*/
private class IdentifierPool {
private Bag<Integer> ids;
private int nextAvailableId;
public IdentifierPool() {
ids = new Bag<Integer>();
}
public int checkOut() {
if(ids.size() > 0) {
return ids.removeLast();
}
return nextAvailableId++;
}
public void checkIn(int id) {
ids.add(id);
}
}
}