Entitas  0.40.0
Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
PrimaryEntityIndex.cs
1 using System;
2 using System.Collections.Generic;
3 
4 namespace Entitas {
5 
6  public class PrimaryEntityIndex<TEntity, TKey> : AbstractEntityIndex<TEntity, TKey> where TEntity : class, IEntity, new() {
7 
8  readonly Dictionary<TKey, TEntity> _index;
9 
10  public PrimaryEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey> getKey) : base(name, group, getKey) {
11  _index = new Dictionary<TKey, TEntity>();
12  Activate();
13  }
14 
15  public PrimaryEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey[]> getKeys) : base(name, group, getKeys) {
16  _index = new Dictionary<TKey, TEntity>();
17  Activate();
18  }
19 
20  public PrimaryEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey> getKey, IEqualityComparer<TKey> comparer) : base(name, group, getKey) {
21  _index = new Dictionary<TKey, TEntity>(comparer);
22  Activate();
23  }
24 
25  public PrimaryEntityIndex(string name, IGroup<TEntity> group, Func<TEntity, IComponent, TKey[]> getKeys, IEqualityComparer<TKey> comparer) : base(name, group, getKeys) {
26  _index = new Dictionary<TKey, TEntity>(comparer);
27  Activate();
28  }
29 
30  public override void Activate() {
31  base.Activate();
32  indexEntities(_group);
33  }
34 
35  public TEntity GetEntity(TKey key) {
36  TEntity entity;
37  _index.TryGetValue(key, out entity);
38  return entity;
39  }
40 
41  public override string ToString() {
42  return "PrimaryEntityIndex(" + name + ")";
43  }
44 
45  protected override void clear() {
46  foreach(var entity in _index.Values) {
47 
48 #if ENTITAS_FAST_AND_UNSAFE
49  entity.Release(this);
50 #else
51  if(entity.owners.Contains(this)) {
52  entity.Release(this);
53  }
54 #endif
55  }
56 
57  _index.Clear();
58  }
59 
60  protected override void addEntity(TKey key, TEntity entity) {
61  if(_index.ContainsKey(key)) {
62  throw new EntityIndexException(
63  "Entity for key '" + key + "' already exists!",
64  "Only one entity for a primary key is allowed.");
65  }
66 
67  _index.Add(key, entity);
68 
69 #if ENTITAS_FAST_AND_UNSAFE
70  entity.Retain(this);
71 #else
72  if(!entity.owners.Contains(this)) {
73  entity.Retain(this);
74  }
75 #endif
76  }
77 
78  protected override void removeEntity(TKey key, TEntity entity) {
79  _index.Remove(key);
80 
81 #if ENTITAS_FAST_AND_UNSAFE
82  entity.Release(this);
83 #else
84  if(entity.owners.Contains(this)) {
85  entity.Release(this);
86  }
87 #endif
88  }
89  }
90 }