File: ObjectTable.sc

package info (click to toggle)
supercollider 1%3A3.10.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 45,496 kB
  • sloc: cpp: 283,513; lisp: 74,040; ansic: 72,252; sh: 23,016; python: 7,175; makefile: 1,087; perl: 766; java: 677; yacc: 314; lex: 175; ruby: 136; objc: 65; xml: 15
file content (101 lines) | stat: -rw-r--r-- 1,516 bytes parent folder | download | duplicates (6)
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);
		});
	}
}