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 97 98 99 100 101
  
     | 
    
      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);
	}
	storeItemsOn { arg stream, itemsPerLine = 5;
		^idToObj.storeItemsOn(stream, itemsPerLine)
	}
	printItemsOn { arg stream, itemsPerLine = 5;
		^idToObj.printItemsOn(stream, itemsPerLine)
	}
	// 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);
		});
	}
}
 
     |