Annotation of objc/List.m, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.0 (the 'License').  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License."
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:        List.m
                     26:        Copyright 1988, 1989 NeXT, Inc.
                     27:        Written by: Bryan Yamamoto
                     28:        Responsibility: Bertrand Serlet
                     29: */
                     30: 
                     31: #ifdef SHLIB
                     32: #import "shlib.h"
                     33: #endif SHLIB
                     34: 
                     35: #import <stdlib.h>
                     36: #import <stdio.h>
                     37: #import <string.h>
                     38: #import "List.h"
                     39: 
                     40: #define DATASIZE(count) ((count) * sizeof(id))
                     41: 
                     42: @implementation  List
                     43: 
                     44: + initialize
                     45: {
                     46:     [self setVersion: 1];
                     47:     return self;
                     48: }
                     49: 
                     50: - initCount:(unsigned)numSlots
                     51: {
                     52:     maxElements = numSlots;
                     53:     if (maxElements) 
                     54:        dataPtr = (id *)NXZoneMalloc([self zone], DATASIZE(maxElements));
                     55:     return self;
                     56: }
                     57: 
                     58: + newCount:(unsigned)numSlots
                     59: {
                     60:     return [[self allocFromZone: NXDefaultMallocZone()] initCount:numSlots];
                     61: }
                     62: 
                     63: + new
                     64: {
                     65:     return [self newCount:0];
                     66: }
                     67: 
                     68: - init
                     69: {
                     70:     return [self initCount:0];
                     71: }
                     72: 
                     73: - free
                     74: {
                     75:     free(dataPtr);
                     76:     return [super free];
                     77: }
                     78: 
                     79: - freeObjects
                     80: {
                     81:     id element;
                     82:     while ((element = [self removeLastObject]))
                     83:        [element free];
                     84:     return self;
                     85: }
                     86: 
                     87: - copyFromZone:(NXZone *)zone
                     88: {
                     89:     List       *new = [[[self class] allocFromZone:zone] initCount: numElements];
                     90:     new->numElements = numElements;
                     91:     bcopy (dataPtr, new->dataPtr, DATASIZE(numElements));
                     92:     return new;
                     93: }
                     94: 
                     95: - (BOOL) isEqual: anObject
                     96: {
                     97:     List       *other;
                     98:     if (! [anObject isKindOf: [self class]]) return NO;
                     99:     other = (List *) anObject;
                    100:     return (numElements == other->numElements) 
                    101:        && (bcmp (dataPtr, other->dataPtr, DATASIZE(numElements)) == 0);
                    102: }
                    103: 
                    104: - (unsigned)capacity
                    105: {
                    106:     return maxElements;
                    107: }
                    108: 
                    109: - (unsigned)count
                    110: {
                    111:     return numElements;
                    112: }
                    113: 
                    114: - objectAt:(unsigned)index
                    115: {
                    116:     if (index >= numElements)
                    117:        return nil;
                    118:     return dataPtr[index];
                    119: }
                    120: 
                    121: - (unsigned)indexOf:anObject
                    122: {
                    123:     register id *this = dataPtr;
                    124:     register id *last = this + numElements;
                    125:     while (this < last) {
                    126:         if (*this == anObject)
                    127:            return this - dataPtr;
                    128:        this++;
                    129:     }
                    130:     return NX_NOT_IN_LIST;
                    131: }
                    132: 
                    133: - lastObject
                    134: {
                    135:     if (! numElements)
                    136:        return nil;
                    137:     return dataPtr[numElements - 1];
                    138: }
                    139: 
                    140: - setAvailableCapacity:(unsigned)numSlots
                    141: {
                    142:     if (numSlots < numElements) return nil;
                    143:     dataPtr = (id *) NXZoneRealloc ([self zone], dataPtr, DATASIZE(numSlots));
                    144:     maxElements = numSlots;
                    145:     return self;
                    146: }
                    147: 
                    148: - insertObject:anObject at:(unsigned)index
                    149: {
                    150:     register id *this, *last, *prev;
                    151:     if (! anObject) return nil;
                    152:     if (index > numElements)
                    153:         return nil;
                    154:     if ((numElements + 1) > maxElements) {
                    155:        /* we double the capacity, also a good size for malloc */
                    156:        maxElements += maxElements + 1;
                    157:        dataPtr = (id *) NXZoneRealloc (
                    158:                          [self zone], dataPtr, DATASIZE(maxElements));
                    159:     }
                    160:     this = dataPtr + numElements;
                    161:     prev = this - 1;
                    162:     last = dataPtr + index;
                    163:     while (this > last) 
                    164:        *this-- = *prev--;
                    165:     *last = anObject;
                    166:     numElements++;
                    167:     return self;
                    168: }
                    169: 
                    170: - addObject:anObject
                    171: {
                    172:     return [self insertObject:anObject at:numElements];
                    173:     
                    174: }
                    175: 
                    176: 
                    177: - addObjectIfAbsent:anObject
                    178: {
                    179:     register id *this, *last;
                    180:     if (! anObject) return nil;
                    181:     this = dataPtr;
                    182:     last = dataPtr + numElements;
                    183:     while (this < last) {
                    184:         if (*this == anObject)
                    185:            return self;
                    186:        this++;
                    187:     }
                    188:     return [self insertObject:anObject at:numElements];
                    189:     
                    190: }
                    191: 
                    192: 
                    193: - removeObjectAt:(unsigned)index
                    194: {
                    195:     register id *this, *last, *next;
                    196:     id retval;
                    197:     if (index >= numElements)
                    198:         return nil;
                    199:     this = dataPtr + index;
                    200:     last = dataPtr + numElements;
                    201:     next = this + 1;
                    202:     retval = *this;
                    203:     while (next < last)
                    204:        *this++ = *next++;
                    205:     numElements--;
                    206:     return retval;
                    207: }
                    208: 
                    209: - removeObject:anObject
                    210: {
                    211:     register id *this, *last;
                    212:     this = dataPtr;
                    213:     last = dataPtr + numElements;
                    214:     while (this < last) {
                    215:        if (*this == anObject)
                    216:            return [self removeObjectAt:this - dataPtr];
                    217:        this++;
                    218:     }
                    219:     return nil;
                    220: }
                    221: 
                    222: - removeLastObject
                    223: {
                    224:     if (! numElements)
                    225:        return nil;
                    226:     return [self removeObjectAt: numElements - 1];
                    227: }
                    228: 
                    229: - empty
                    230: {
                    231:     numElements = 0;
                    232:     return self;
                    233: }
                    234: 
                    235: - replaceObject:anObject with:newObject
                    236: {
                    237:     register id *this, *last;
                    238:     if (! newObject)
                    239:         return nil;
                    240:     this = dataPtr;
                    241:     last = dataPtr + numElements;
                    242:     while (this < last) {
                    243:        if (*this == anObject) {
                    244:            *this = newObject;
                    245:            return anObject;
                    246:        }
                    247:        this++;
                    248:     }
                    249:     return nil;
                    250: }
                    251: 
                    252: - replaceObjectAt:(unsigned)index with:newObject
                    253: {
                    254:     register id *this;
                    255:     id retval;
                    256:     if (! newObject)
                    257:         return nil;
                    258:     if (index >= numElements)
                    259:         return nil;
                    260:     this = dataPtr + index;
                    261:     retval = *this;
                    262:     *this = newObject;
                    263:     return retval;
                    264: }
                    265: 
                    266: #ifndef        KERNEL
                    267: - write:(NXTypedStream *) stream
                    268: {
                    269:     [super write: stream];
                    270:     NXWriteTypes (stream, "i", &numElements);
                    271:     if (numElements)
                    272:        NXWriteArray (stream, "@", numElements, dataPtr);
                    273:     return self;
                    274: }
                    275: 
                    276: - read:(NXTypedStream *) stream
                    277: {
                    278:     NXZone *zone = [self zone];
                    279:     [super read: stream];
                    280:     if (NXTypedStreamClassVersion (stream, "List") == 0) {
                    281:        int             _growAmount = 0;
                    282:        NXReadTypes (stream, "ii", &_growAmount, &numElements);
                    283:        dataPtr = (id *) NXZoneMalloc (zone, numElements*sizeof(id));
                    284:        maxElements = numElements;
                    285:        NXReadArray (stream, "@", numElements, dataPtr);
                    286:     } else {
                    287:        NXReadTypes (stream, "i", &numElements);
                    288:        maxElements = numElements;
                    289:        if (numElements) {
                    290:            dataPtr = (id *) NXZoneMalloc (zone, numElements*sizeof(id));
                    291:            NXReadArray (stream, "@", numElements, dataPtr);
                    292:        }
                    293:     }
                    294:     return self;
                    295: }
                    296: #else  /* KERNEL */
                    297: - write:(NXTypedStream *) stream
                    298: {
                    299:     return nil;
                    300: }
                    301: - read:(NXTypedStream *) stream
                    302: {
                    303:     return nil;
                    304: }
                    305: #endif /* KERNEL */
                    306: 
                    307: - makeObjectsPerform:(SEL)aSelector
                    308: {
                    309:     unsigned   count = numElements;
                    310:     while (count--)
                    311:        [dataPtr[count] perform: aSelector];
                    312:     return self;
                    313: }
                    314: 
                    315: - makeObjectsPerform:(SEL)aSelector with:anObject
                    316: {
                    317:     unsigned   count = numElements;
                    318:     while (count--)
                    319:        [dataPtr[count] perform: aSelector with: anObject];
                    320:     return self;
                    321: }
                    322: 
                    323: -appendList: (List *)otherList
                    324: {
                    325:     unsigned i, count;
                    326:     
                    327:     for (i = 0, count = [otherList count]; i < count; i++)
                    328:        [self addObject: [otherList objectAt: i]];
                    329:     return self;
                    330: }
                    331: 
                    332: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.