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 }