1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
TwoWayIdentityDictionary : Collection
{
var idToObj, objToID;
*new {
^super.new.init;
}
add { arg anAssociation;
this.put(anAssociation.key, anAssociation.value);
}
put { arg key, obj;
idToObj.put(key, obj);
objToID.put(obj, key);
}
remove { arg obj;
var key;
key = this.getID(obj);
idToObj.removeAt(key);
objToID.removeAt(obj);
}
removeAt { arg key;
var obj = this.at(key);
idToObj.removeAt(key);
objToID.removeAt(obj);
}
do { arg function;
^idToObj.do(function);
}
at { arg id;
^idToObj.at(id);
}
getID { arg obj;
^objToID.at(obj);
}
// PRIVATE
init {
idToObj = IdentityDictionary.new;
objToID = IdentityDictionary.new;
}
}
UniqueID {
classvar <id=1000;
*initClass { id = 1000; }
*next { ^id = id + 1; }
}
ObjectTable : TwoWayIdentityDictionary
{
classvar <global;
*new {
^super.new;
}
add { arg obj;
this.put(UniqueID.next, obj);
}
*initClass {
global = this.new;
}
*add { arg obj;
global.add(obj);
^UniqueID.id
}
*put { arg key, obj;
global.put(key, obj);
}
*remove { arg obj;
global.remove(obj);
}
*at { arg id;
^global.at(id);
}
*getID { arg obj;
^global.getID(obj);
}
*objPerform { arg id, selector ... args;
var obj;
obj = global.at(id);
if (obj.notNil, {
obj.performList(selector, args);
});
}
}
|