This is LinkedList.m in view mode; [Download] [Up]
/* Implementation for Objective-C LinkedList collection object Copyright (C) 1993 R. Andrew McCallum <mccallum@cs.rochester.edu> Dept. of Computer Science, U. of Rochester, Rochester, NY 14627 This file is part of the GNU Objective-C Collection library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* I should override a few more methods to increase efficiency. */ #include <coll/LinkedList.h> #include <coll/IndexedCollectionPrivate.h> #include <coll/EltListLink.h> @implementation LinkedList + initialize { if (self == [LinkedList class]) [self setVersion:-1]; /* alpha release */ return self; } // DETERMINING CLASS OF AUTOCREATED LINKS; - linkClass { return [EltListLink class]; } // GETTING THE UNDERLYING LIST; - contentsList { return _contents_list; } // INITIALIZING AND FREEING; /* This is the designated initializer of this class */ - initDescription: (const char *)type { [super initDescription:type]; _contents_list = [[LinkList alloc] init]; return self; } - free { [[_contents_list freeContents] free]; return [super free]; } // ADDING; - insertElement: (elt)newElement atIndex: (unsigned)index { unsigned count = [_contents_list count]; if (INDEX_RANGE_WARNING(index, count+1)) return nil; if (index == count) [_contents_list appendElement:[[[self linkClass] alloc] initElement:newElement]]; else [_contents_list insertElement:[[[self linkClass] alloc] initElement:newElement] before:[_contents_list elementAtIndex:index]]; return self; } // REMOVING AND REPLACING; - (elt) removeElementAtIndex: (unsigned)index { id link; elt ret; if (INDEX_RANGE_WARNING(index, [_contents_list count])) return COLL_NO_ELEMENT; link = [_contents_list removeElementAtIndex:index].id_t; ret = [link elementData]; [link free]; return ret; } - (elt) removeElement: (elt)oldElement { id aLink = [self linkWithElement:oldElement]; elt ret; if (!aLink) return COLL_NO_ELEMENT; ret = [aLink elementData]; [_contents_list removeElement:aLink]; [aLink free]; return ret; } /* I should add replace... here */ // GETTING ELEMENTS BY INDEX; - (elt) elementAtIndex: (unsigned)index { if (INDEX_RANGE_WARNING(index, [_contents_list count])) return COLL_NO_ELEMENT; return [[_contents_list elementAtIndex:index].id_t elementData]; } // TESTING; - linkWithElement: (elt)anElement { id link; BOOL test(elt link) { if (_compare_func([link.id_t elementData].void_ptr_t, anElement.void_ptr_t)) return YES; else return NO; } link = [_contents_list detectElementByCalling:test].id_t; if (link == COLL_NO_OBJECT) [self errorElementNotFound:anElement inMethod:_cmd]; return link; } - (unsigned) count { return [_contents_list count]; } // ENUMERATING; - (BOOL) getNextElement:(elt *)anElementPtr withEnumState: (void**)enumState { elt link; BOOL flag; flag = [_contents_list getNextElement:&link withEnumState:enumState]; if (flag) *anElementPtr = [link.id_t elementData]; return flag; } - (BOOL) getPrevElement:(elt *)anElementPtr withEnumState: (void**)enumState { elt link; BOOL flag; flag = [_contents_list getPrevElement:&link withEnumState:enumState]; if (flag) *anElementPtr = [link.id_t elementData]; return flag; } - withElementsCall: (void(*)(elt))aFunc whileTrue:(BOOL *)flag { void doIt(elt link) { aFunc([link.id_t elementData]); } [_contents_list withElementsCall:doIt whileTrue:flag]; /* crashed using 'withObjectsCall:whileTrue:' */ return self; } - withElementsInReverseCall: (void(*)(elt))aFunc whileTrue:(BOOL *)flag { void doIt(elt link) { aFunc([link.id_t elementData]); } [_contents_list withElementsInReverseCall:doIt whileTrue:flag]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.