Entitas  0.40.0
Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
AbstractEntityIndex.cs
1 using System;
2 
3 namespace Entitas {
4 
5  public abstract class AbstractEntityIndex<TEntity, TKey> : IEntityIndex where TEntity : class, IEntity, new() {
6 
7  public string name { get { return _name; } }
8 
9  protected readonly string _name;
10  protected readonly IGroup<TEntity> _group;
11  protected readonly Func<TEntity, IComponent, TKey> _getKey;
12  protected readonly Func<TEntity, IComponent, TKey[]> _getKeys;
13  protected readonly bool _isSingleKey;
14 
15  protected AbstractEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey> getKey) {
16  _name = name;
17  _group = group;
18  _getKey = getKey;
19  _isSingleKey = true;
20  }
21 
22  protected AbstractEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey[]> getKeys) {
23  _name = name;
24  _group = group;
25  _getKeys = getKeys;
26  _isSingleKey = false;
27  }
28 
29  public virtual void Activate() {
30  _group.OnEntityAdded += onEntityAdded;
31  _group.OnEntityRemoved += onEntityRemoved;
32  }
33 
34  public virtual void Deactivate() {
35  _group.OnEntityAdded -= onEntityAdded;
36  _group.OnEntityRemoved -= onEntityRemoved;
37  clear();
38  }
39 
40  public override string ToString() {
41  return name;
42  }
43 
44  protected void indexEntities(IGroup<TEntity> group) {
45  var entities = group.GetEntities();
46  for(int i = 0; i < entities.Length; i++) {
47  var entity = entities[i];
48  if(_isSingleKey) {
49  addEntity(_getKey(entity, null), entity);
50  } else {
51  var keys = _getKeys(entity, null);
52  for(int j = 0; j < keys.Length; j++) {
53  addEntity(keys[j], entity);
54  }
55  }
56  }
57  }
58 
59  protected void onEntityAdded(IGroup<TEntity> group, TEntity entity, int index, IComponent component) {
60  if(_isSingleKey) {
61  addEntity(_getKey(entity, component), entity);
62  } else {
63  var keys = _getKeys(entity, component);
64  for(int i = 0; i < keys.Length; i++) {
65  addEntity(keys[i], entity);
66  }
67  }
68  }
69 
70  protected void onEntityRemoved(IGroup<TEntity> group, TEntity entity, int index, IComponent component) {
71  if(_isSingleKey) {
72  removeEntity(_getKey(entity, component), entity);
73  } else {
74  var keys = _getKeys(entity, component);
75  for(int i = 0; i < keys.Length; i++) {
76  removeEntity(keys[i], entity);
77  }
78  }
79  }
80 
81  protected abstract void addEntity(TKey key, TEntity entity);
82 
83  protected abstract void removeEntity(TKey key, TEntity entity);
84 
85  protected abstract void clear();
86 
88  Deactivate();
89  }
90  }
91 }