This is RealMutableArray.m in view mode; [Download] [Up]
/*-------------------------------------------------------------------------- * * You may freely copy, distribute, and reuse the code in this example. * SHL Systemhouse disclaims any warranty of any kind, expressed or * implied, as to its fitness for any particular use. * * * RealMutableArray * * Inherits From: NSMutableArray * * Conforms To: NSCopying, NSMutableCopying, NSCoding * * Declared In: RealMutableArray.h * * *------------------------------------------------------------------------*/ #import "RealMutableArray.h" #define ARRAY_DEFAULT_CAPACITY 10 @implementation RealMutableArray /*-------------------------------------------------------------------------- * Allocing, initing, and deallocing *------------------------------------------------------------------------*/ + array { return [self arrayWithCapacity:(unsigned)ARRAY_DEFAULT_CAPACITY]; } + arrayWithCapacity: (unsigned)aNumItems { return [[[self alloc] initWithCapacity: aNumItems] autorelease]; } - initWithCapacity:(unsigned)aNumItems { unsigned iterator; array = [[NSMutableArray arrayWithCapacity:aNumItems] retain]; count = 0; capacity = aNumItems; for (iterator = 0; iterator < aNumItems; iterator++) [array addObject: [[Null alloc] init]]; return self; } - (void) dealloc { [array release]; return [super dealloc]; } /*-------------------------------------------------------------------------- * Immutable array primitives *------------------------------------------------------------------------*/ - (unsigned)count { return [array count]; } - objectAtIndex:(unsigned)index { id current; if (index > capacity) return nil; current = [array objectAtIndex: index]; if ([current isKindOfClass: [Null class]]) return nil; else return current; } /*-------------------------------------------------------------------------- * Mutable array primitives *------------------------------------------------------------------------*/ - (void)addObject:object { unsigned iterator = 0; if (count == capacity) { NSLog(@"RealMutable: Array full -- cannot addObject %s", [[object description] cString]); return; } while ([[array objectAtIndex: iterator] isKindOfClass: [Null class]] == NO) iterator++; [array replaceObjectAtIndex:iterator withObject:object]; count++; return; } - (void)replaceObjectAtIndex:(unsigned)index withObject:object { id current = [array objectAtIndex:index]; if ([current isKindOfClass: [Null class]] == YES) count++; return [array replaceObjectAtIndex:index withObject:object]; } - (void)removeLastObject { unsigned iterator = capacity-1; if (count == 0) { NSLog(@"RemoveLastObject: RealMutableArray empty."); return; } while ([[array objectAtIndex: iterator] isKindOfClass: [Null class]] == YES) { iterator--; } [array replaceObjectAtIndex:iterator withObject:[[Null alloc] init]]; count--; return; } - (void)insertObject:object atIndex:(unsigned)index { id current = [array objectAtIndex: index]; if ([current isKindOfClass: [Null class]] == YES) count++; return [array replaceObjectAtIndex:index withObject:object]; } - (void)removeObjectAtIndex:(unsigned)index { id current = [array objectAtIndex: index]; if ([current isKindOfClass: [Null class]] == NO) { count--; [array replaceObjectAtIndex:index withObject:[[Null alloc] init]]; } return; } @end @implementation Null : NSObject { } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.