1 module artemisd.managers.tagmanager;
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 TagManager : Manager 
10 {
11     
12     mixin TypeDecl;
13 
14     private Entity[string] entitiesByTag;
15     private string[Entity] tagsByEntity;
16 
17     void register(string tag, Entity e) 
18     {
19         entitiesByTag[tag] = e;
20         tagsByEntity[e] = tag;
21     }
22 
23     void unregister(string tag) 
24     {
25         auto e = tag in entitiesByTag;
26         if(e)
27         {
28             tagsByEntity.remove(*e);
29             entitiesByTag.remove(tag);
30         }
31     }
32 
33     bool isRegistered(string tag) 
34     {
35         return (tag in entitiesByTag) !is null;
36     }
37 
38     Entity getEntity(string tag) 
39     {
40         auto e = tag in entitiesByTag;
41         return e ? *e : null;
42     }
43     
44     public auto getRegisteredTags() 
45     {
46         return tagsByEntity.values;
47     }
48     
49     override void deleted(Entity e) 
50     {
51         auto removedTag = e in tagsByEntity;
52         if(removedTag) 
53         {
54             entitiesByTag.remove(*removedTag);
55             tagsByEntity.remove(e);
56         }
57     }
58 
59     protected override void initialize() 
60     {
61     }
62 }
63 unittest
64 {
65     TagManager m = new TagManager;
66     import artemisd.world;
67     World w = new World;
68     Entity e = w.createEntity();
69 
70     m.register("g1",e);
71     assert(m.isRegistered("g1"));
72     assert(m.getEntity("g1") == e);
73     m.unregister("g1");
74     assert(!m.isRegistered("g1"));
75     assert(m.getEntity("g1") is null);
76 }