ftp.nice.ch/pub/next/developer/objc/gamekit/gamekit_future.s.tar.gz#/gamekit_future/gamekit-1/GKActorManager.m

This is GKActorManager.m in view mode; [Download] [Up]

#import <gamekit/gamekit.h>
#import <objc/objc-runtime.h>

@implementation GKActorManager

- init
{
	id ret = [super init];
	actorHash = [[HashTable alloc] initKeyDesc:"@" valueDesc:"@" capacity:0];
	return ret;
}

- listOfActorsOfClass:aClass
{	// get the list of actors for the given class.  If no list yet, make one.
	id list = [actorHash valueForKey:aClass];
	if (!list) {
		list = [[List alloc] init];
		[actorHash insertKey:aClass value:list];
	}
	return list;
}

- addDeadActor:anActor
{
	id list = [self listOfActorsOfClass:[anActor class]];
	// I'd use -addObjectIfAbsent: but this is faster.  Don't add an object
	// twice, though, or actors will start behaving _really_ strangely!
	// (Like jumping around, disappearing, or suddenly "starting over")
	[list addObject:anActor];
	return self;
}

- getActorOfClass:aClass
{	// list should NEVER be nil!
	id list = [actorHash listOfActorsOfClass:aClass];
	int count = [list count]; //send message once...cache the result
	if (!count) return [[aClass alloc] init];
	// removing from end is fastest
	return [list removeObjectAt:(count-1)];
}

- getActorOfClassNamed:(char *)className
{
	[self getActorOfClass:objc_lookUpClass(className)];
	return self;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.