//http://www.santafe.edu/projects/swarm/archive/list-archive.9907/0186.html //See below for an example of createIndex:fromMember: and its use with //Lists where members objects store the links (thus ensuring unique //members and the notion of a `set'). Compare the two code sections //within the "#if 1" area -- they are functionally equivalent. #import #import #import #import @interface Integer: CreateDrop { int value; member_t link; } - setValue: (int)value; - (int)getValue; @end @implementation Integer - setValue: (int)theValue { value = theValue; return self; } - (int)getValue { return value; } - (void)describe: outputCharStream { char buf[DSIZE (int) + 1 + 1]; sprintf (buf, "%d\n", value); [outputCharStream catC: buf]; } @end #define MAKEINTEGER(aZone,value) \ [[[Integer createBegin: aZone] setValue: value] createEnd] int main (int argc, const char **argv) { initSwarmBatch (argc, argv); { id aZone = [Zone create: globalZone]; id member; id index; #if 1 id l; l = [List createBegin: aZone]; [l setIndexFromMemberLoc: offsetof (Integer, link)]; l = [l createEnd]; [l addLast: MAKEINTEGER (aZone, 10)]; member = MAKEINTEGER (aZone, 20); [l addLast: member]; index = [l createIndex: aZone fromMember: member]; [l addLast: MAKEINTEGER (aZone, 30)]; #else id s; s = [OrderedSet createBegin: aZone]; [s setIndexFromMemberLoc: offsetof (Integer, link)]; s = [s createEnd]; [s add: MAKEINTEGER (aZone, 10)]; member = MAKEINTEGER (aZone, 20); [s add: member]; index = [s createIndex: aZone fromMember: member]; [s add: MAKEINTEGER (aZone, 30)]; #endif do xprint (member); while (member = [index next]); } } /* Local Variables: compile-command: "/opt/src/mgd/packages/swarm/swarm/bin/libtool-swarm --mode=link /opt/src/mgd/packages/development/egcs/bin/gcc -o memberloc -g -Wno-import -I/opt/src/mgd/packages/swarm/swarm/include -L/opt/src/mgd/packages/swarm/swarm/lib memberloc.m -lswarm -lobjc" End: */