1 module artemisd.managers.groupmanager;
2 
3 import artemisd.entity;
4 import artemisd.manager;
5 import artemisd.utils.bag;
6 import artemisd.utils.type;
7 import artemisd.utils.ext;
8 
9 public class GroupManager : Manager {
10   
11     mixin TypeDecl;
12 
13     private Bag!Entity[string] entitiesByGroup;
14     private Bag!string[Entity] groupsByEntity;
15 
16     protected override void initialize() {
17     }
18     
19     public void add(Entity e, string group) {
20         auto entities = entitiesByGroup.getWithDefault(group, new Bag!Entity);
21         entities.add(e);
22 
23         auto groups = groupsByEntity.getWithDefault(e, new Bag!string);
24         groups.add(group);
25     }
26 
27     public void remove(Entity e, string group) {
28         Bag!Entity* entities = group in entitiesByGroup;
29         if(entities) {
30             entities.remove(e);
31         }
32         
33         Bag!string* groups = e in groupsByEntity;
34         if(groups) {
35             groups.remove(group);
36         }
37     }
38     
39     public void removeFromAllGroups(Entity e) {
40         Bag!string* groups = e in groupsByEntity;
41         if(groups != null) {
42             for(int i = 0; groups.size() > i; i++) {
43                 Bag!Entity* entities = groups.get(i) in entitiesByGroup;
44                 if(entities != null) {
45                     entities.remove(e);
46                 }
47             }
48             groups.clear();
49         }
50     }
51     
52     public Bag!Entity getEntities(string group) {
53         return entitiesByGroup.getWithDefault(group, new Bag!Entity);
54     }
55     
56     public Bag!string getGroups(Entity e) { 
57         auto group = e in groupsByEntity;
58         return group ? *group : null;
59     }
60     
61     public bool isInAnyGroup(Entity e) {
62         auto groups = getGroups(e);
63         return groups !is null && groups.size > 0;
64     }
65     
66     public bool isInGroup(Entity e, string group) {
67         auto groups = e in groupsByEntity;
68         return groups ? groups.contains(group) : false;
69     }
70 
71     public override void deleted(Entity e) {
72         removeFromAllGroups(e);
73     }
74 }
75 
76 unittest
77 {
78     GroupManager gm = new GroupManager;
79     import artemisd.world;
80     World w = new World;
81     Entity e = w.createEntity();
82     gm.add(e,"g1");
83     gm.add(e,"g2");
84     assert(gm.isInGroup(e, "g1"));
85     assert(gm.isInGroup(e, "g2"));
86     assert(gm.isInAnyGroup(e));
87     assert(gm.getGroups(e).toString() == "[g1,g2]");
88 
89     gm.remove(e,"g2");
90     assert(gm.isInGroup(e, "g1"));
91     assert(!gm.isInGroup(e, "g2"));
92     assert(gm.isInAnyGroup(e));
93     assert(gm.getGroups(e).toString() == "[g1]");
94 
95     gm.remove(e,"g1");
96     assert(!gm.isInGroup(e, "g1"));
97     assert(!gm.isInGroup(e, "g2"));
98     assert(!gm.isInAnyGroup(e));
99     assert(gm.getGroups(e).toString() == "[]");
100 
101     gm.add(e,"g1");
102     gm.add(e,"g2");
103     assert(gm.isInGroup(e, "g1"));
104     assert(gm.isInGroup(e, "g2"));
105     assert(gm.isInAnyGroup(e));
106     gm.removeFromAllGroups(e);
107     assert(!gm.isInGroup(e, "g1"));
108     assert(!gm.isInGroup(e, "g2"));
109     assert(!gm.isInAnyGroup(e));
110 }