Home | History | Annotate | Download | only in Framework
      1 //
      2 //  ANTLRPtrBuffer.m
      3 //  ANTLR
      4 //
      5 //  Created by Alan Condit on 6/9/10.
      6 // [The "BSD licence"]
      7 // Copyright (c) 2010 Alan Condit
      8 // All rights reserved.
      9 //
     10 // Redistribution and use in source and binary forms, with or without
     11 // modification, are permitted provided that the following conditions
     12 // are met:
     13 // 1. Redistributions of source code must retain the above copyright
     14 //    notice, this list of conditions and the following disclaimer.
     15 // 2. Redistributions in binary form must reproduce the above copyright
     16 //    notice, this list of conditions and the following disclaimer in the
     17 //    documentation and/or other materials provided with the distribution.
     18 // 3. The name of the author may not be used to endorse or promote products
     19 //    derived from this software without specific prior written permission.
     20 //
     21 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31 
     32 #define SUCCESS (0)
     33 #define FAILURE (-1)
     34 
     35 #import "ANTLRPtrBuffer.h"
     36 #import "ANTLRTree.h"
     37 
     38 /*
     39  * Start of ANTLRPtrBuffer
     40  */
     41 @implementation ANTLRPtrBuffer
     42 
     43 @synthesize BuffSize;
     44 @synthesize buffer;
     45 @synthesize ptrBuffer;
     46 @synthesize count;
     47 @synthesize ptr;
     48 
     49 +(ANTLRPtrBuffer *)newANTLRPtrBuffer
     50 {
     51     return [[ANTLRPtrBuffer alloc] init];
     52 }
     53 
     54 +(ANTLRPtrBuffer *)newANTLRPtrBufferWithLen:(NSInteger)cnt
     55 {
     56     return [[ANTLRPtrBuffer alloc] initWithLen:cnt];
     57 }
     58 
     59 -(id)init
     60 {
     61     NSUInteger idx;
     62     
     63     self = [super init];
     64     if ( self != nil ) {
     65         BuffSize  = BUFFSIZE;
     66         ptr = 0;
     67         buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
     68         ptrBuffer = (id *) [buffer mutableBytes];
     69         for( idx = 0; idx < BuffSize; idx++ ) {
     70             ptrBuffer[idx] = nil;
     71         }
     72         count = 0;
     73     }
     74     return( self );
     75 }
     76 
     77 -(id)initWithLen:(NSUInteger)cnt
     78 {
     79     NSUInteger idx;
     80     
     81     self = [super init];
     82     if ( self != nil ) {
     83         BuffSize  = cnt;
     84         ptr = 0;
     85         buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
     86         ptrBuffer = (id *)[buffer mutableBytes];
     87         for( idx = 0; idx < BuffSize; idx++ ) {
     88             ptrBuffer[idx] = nil;
     89         }
     90         count = 0;
     91     }
     92     return( self );
     93 }
     94 
     95 -(void)dealloc
     96 {
     97 #ifdef DEBUG_DEALLOC
     98     NSLog( @"called dealloc in ANTLRPtrBuffer" );
     99 #endif
    100     ANTLRLinkBase *tmp, *rtmp;
    101     NSInteger idx;
    102     
    103     if ( self.fNext != nil ) {
    104         for( idx = 0; idx < BuffSize; idx++ ) {
    105             tmp = ptrBuffer[idx];
    106             while ( tmp ) {
    107                 rtmp = tmp;
    108                 if ([tmp isKindOfClass:[ANTLRLinkBase class]])
    109                     tmp = (id)tmp.fNext;
    110                 else
    111                     tmp = nil;
    112                 [rtmp release];
    113             }
    114         }
    115     }
    116     [buffer release];
    117     [super dealloc];
    118 }
    119 
    120 - (id) copyWithZone:(NSZone *)aZone
    121 {
    122     ANTLRPtrBuffer *copy;
    123     
    124     copy = [[[self class] allocWithZone:aZone] init];
    125     if ( buffer )
    126         copy.buffer = [buffer copyWithZone:aZone];
    127     copy.ptrBuffer = ptrBuffer;
    128     copy.ptr = ptr;
    129     return copy;
    130 }
    131 
    132 - (void)clear
    133 {
    134     ANTLRLinkBase *tmp, *rtmp;
    135     NSInteger idx;
    136 
    137     for( idx = 0; idx < BuffSize; idx++ ) {
    138         tmp = ptrBuffer[idx];
    139         while ( tmp ) {
    140             rtmp = tmp;
    141             if ([tmp isKindOfClass:[ANTLRLinkBase class]])
    142                 tmp = (id)tmp.fNext;
    143             else
    144                 tmp = nil;
    145             [rtmp dealloc];
    146         }
    147         ptrBuffer[idx] = nil;
    148     }
    149     count = 0;
    150 }
    151 
    152 - (NSMutableData *)getBuffer
    153 {
    154     return( buffer );
    155 }
    156 
    157 - (void)setBuffer:(NSMutableData *)np
    158 {
    159     buffer = np;
    160 }
    161 
    162 - (NSUInteger)getCount
    163 {
    164     return( count );
    165 }
    166 
    167 - (void)setCount:(NSUInteger)aCount
    168 {
    169     count = aCount;
    170 }
    171 
    172 - (id *)getPtrBuffer
    173 {
    174     return( ptrBuffer );
    175 }
    176 
    177 - (void)setPtrBuffer:(id *)np
    178 {
    179     ptrBuffer = np;
    180 }
    181 
    182 - (NSUInteger)getPtr
    183 {
    184     return( ptr );
    185 }
    186 
    187 - (void)setPtr:(NSUInteger)aPtr
    188 {
    189     ptr = aPtr;
    190 }
    191 
    192 - (void) addObject:(id) v
    193 {
    194     [self ensureCapacity:ptr];
    195     if ( v ) [v retain];
    196     ptrBuffer[ptr++] = v;
    197     count++;
    198 }
    199 
    200 - (void) push:(id) v
    201 {
    202     if ( ptr >= BuffSize - 1 ) {
    203         [self ensureCapacity:ptr];
    204     }
    205     if ( v ) [v retain];
    206     ptrBuffer[ptr++] = v;
    207     count++;
    208 }
    209 
    210 - (id) pop
    211 {
    212     id v = nil;
    213     if ( ptr > 0 ) {
    214         v = ptrBuffer[--ptr];
    215         ptrBuffer[ptr] = nil;
    216     }
    217     count--;
    218     if ( v ) [v release];
    219     return v;
    220 }
    221 
    222 - (id) peek
    223 {
    224     id v = nil;
    225     if ( ptr > 0 ) {
    226         v = ptrBuffer[ptr-1];
    227     }
    228     return v;
    229 }
    230 
    231 - (NSUInteger)count
    232 {
    233 #ifdef DONTUSENOMO
    234     int cnt = 0;
    235     
    236     for (NSInteger i = 0; i < BuffSize; i++ ) {
    237         if ( ptrBuffer[i] != nil ) {
    238             cnt++;
    239         }
    240     }
    241     if ( cnt != count ) count = cnt;
    242 #endif
    243     return count;
    244 }
    245 
    246 - (NSUInteger)length
    247 {
    248     return BuffSize;
    249 }
    250 
    251 - (NSUInteger)size
    252 {
    253     NSUInteger aSize = 0;
    254     for (int i = 0; i < BuffSize; i++ ) {
    255         if (ptrBuffer[i] != nil) {
    256             aSize += sizeof(id);
    257         }
    258     }
    259     return aSize;
    260 }
    261 
    262 - (void) insertObject:(id)aRule atIndex:(NSUInteger)idx
    263 {
    264     if ( idx >= BuffSize ) {
    265         [self ensureCapacity:idx];
    266     }
    267     if ( aRule != ptrBuffer[idx] ) {
    268         if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
    269         if ( aRule ) [aRule retain];
    270     }
    271     ptrBuffer[idx] = aRule;
    272     count++;
    273 }
    274 
    275 - (id)objectAtIndex:(NSUInteger)idx
    276 {
    277     if ( idx < BuffSize ) {
    278         return ptrBuffer[idx];
    279     }
    280     return nil;
    281 }
    282 
    283 - (void)addObjectsFromArray:(ANTLRPtrBuffer *)anArray
    284 {
    285     NSInteger cnt, i;
    286     cnt = [anArray count];
    287     for( i = 0; i < cnt; i++) {
    288         id tmp = [anArray objectAtIndex:i];
    289         if ( tmp ) [tmp retain];
    290         [self insertObject:tmp atIndex:i];
    291     }
    292     count += cnt;
    293     return;
    294 }
    295 
    296 - (void)removeAllObjects
    297 {
    298     int i;
    299     for ( i = 0; i < BuffSize; i++ ) {
    300         if ( ptrBuffer[i] ) [ptrBuffer[i] release];
    301         ptrBuffer[i] = nil;
    302     }
    303     count = 0;
    304     ptr = 0;
    305 }
    306 
    307 - (void)removeObjectAtIndex:(NSInteger)idx
    308 {
    309     int i;
    310     if ( idx >= 0 && idx < count ) {
    311         if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
    312         for ( i = idx; i < count-1; i++ ) {
    313             ptrBuffer[i] = ptrBuffer[i+1];
    314         }
    315         ptrBuffer[i] = nil;
    316         count--;
    317     }
    318 }
    319 
    320 - (void) ensureCapacity:(NSUInteger) anIndex
    321 {
    322     if ((anIndex * sizeof(id)) >= [buffer length])
    323     {
    324         NSInteger newSize = ([buffer length] / sizeof(id)) * 2;
    325         if (anIndex > newSize) {
    326             newSize = anIndex + 1;
    327         }
    328         BuffSize = newSize;
    329         [buffer setLength:(BuffSize * sizeof(id))];
    330         ptrBuffer = [buffer mutableBytes];
    331     }
    332 }
    333 
    334 - (NSString *) description
    335 {
    336     NSMutableString *str;
    337     NSInteger idx, cnt;
    338     cnt = [self count];
    339     str = [NSMutableString stringWithCapacity:30];
    340     [str appendString:@"["];
    341     for (idx = 0; idx < cnt; idx++ ) {
    342         [str appendString:[[self objectAtIndex:idx] description]];
    343     }
    344     [str appendString:@"]"];
    345     return str;
    346 }
    347 
    348 - (NSString *) toString
    349 {
    350     return [self description];
    351 }
    352 
    353 @end
    354