This is MiscPriorityQueue.m in view mode; [Download] [Up]
// // MiscPriorityQueue.m -- a Priority Queue // Written by Doug McClure Copyright (c) 1994 by Doug McClure. // Version 1.0. All rights reserved. // // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the author // and its use is governed by the MiscKit license, found in the file // "LICENSE.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. // /* * $RCSfile$ * * $Author$ * * $Revision$ * * $Date$ * */ #import <misckit/MiscPriorityQueue.h> #define MiscPriorityQueueVersion 100 typedef struct _Node { unsigned priority; id object; } Node; @implementation MiscPriorityQueue - dequeue { Node *node; if ( [self count] ) { node = ((Node *)[self lastElement]); [self removeLastElement]; return node->object; } return nil; } - enqueue:anObject withPriority:(int)priority { Node *newNode; newNode = (Node *)NXZoneMalloc([self zone], sizeof(Node)); newNode->priority = priority; newNode->object = anObject; return [self addElement:newNode]; } - init { return [self initCount:0]; } - initCount:(unsigned int)numSlots { return [self initCount:numSlots elementSize:sizeof(Node) description:@encode(Node)]; } - (BOOL)isEqual:anObject { return NO; } - (unsigned)highestPriority { return [self priorityAt:([self count]-1)]; } - (unsigned)lowestPriority { return [self priorityAt:0]; } - makeObjectsPerform:(SEL)aSelector { Node *node; for ( node = ((Node *)[self setFirstElement]) ; (id)node != nil ; node = ((Node *)[self setNextElement]) ) { if ( [node->object respondsTo:aSelector] ) { [node->object perform:aSelector]; } } return self; } - makeObjectsPerform:(SEL)aSelector with:anObject { Node *node; for ( node = ((Node *)[self setFirstElement]) ; (id)node != nil ; node = ((Node *)[self setNextElement]) ) { if ( [node->object respondsTo:aSelector] ) { [node->object perform:aSelector with:anObject]; } } return self; } - objectAt:(unsigned)index { Node *node; if ( index < [self count] ) { node = ((Node*)[self elementAt:index]); return node->object; } return nil; } - (unsigned)priorityAt:(unsigned)index { Node *node; if ( index < [self count] ) { node = ((Node*)[self elementAt:index]); return node->priority; } return NX_NOT_IN_LIST; } - read:(NXTypedStream *)stream { return self; } - write:(NXTypedStream *)stream { return self; } @end @implementation MiscPriorityQueue(OverrideMethods) - (int)compare:(void *)elementA to:(void *)elementB caseCheck:(BOOL)flag { Node *nodeA = ((Node *)elementA); Node *nodeB = ((Node *)elementB); if ( nodeA->priority < nodeB->priority ) { return -1; } else if ( nodeA->priority > nodeB->priority ) { return 1; } else { return 0; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.