Home | History | Annotate | Download | only in Framework
      1 //
      2 //  ANTLRIntArray.m
      3 //  ANTLR
      4 //
      5 //  Created by Ian Michell on 27/04/2010.
      6 // Copyright (c) 2010 Ian Michell 2010 Alan Condit
      7 // All rights reserved.
      8 //
      9 // Redistribution and use in source and binary forms, with or without
     10 // modification, are permitted provided that the following conditions
     11 // are met:
     12 // 1. Redistributions of source code must retain the above copyright
     13 //    notice, this list of conditions and the following disclaimer.
     14 // 2. Redistributions in binary form must reproduce the above copyright
     15 //    notice, this list of conditions and the following disclaimer in the
     16 //    documentation and/or other materials provided with the distribution.
     17 // 3. The name of the author may not be used to endorse or promote products
     18 //    derived from this software without specific prior written permission.
     19 //
     20 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #import "ANTLRIntArray.h"
     32 #import "ANTLRRuntimeException.h"
     33 
     34 @implementation ANTLRIntArray
     35 
     36 @synthesize BuffSize;
     37 @synthesize count;
     38 @synthesize idx;
     39 @synthesize buffer;
     40 @synthesize intBuffer;
     41 @synthesize SPARSE;
     42 
     43 + (ANTLRIntArray *)newArray
     44 {
     45     return [[ANTLRIntArray alloc] init];
     46 }
     47 
     48 + (ANTLRIntArray *)newArrayWithLen:(NSUInteger)aLen
     49 {
     50     return [[ANTLRIntArray alloc] initWithLen:aLen];
     51 }
     52 
     53 - (id)init
     54 {
     55     self = [super init];
     56     if ( self != nil ) {
     57         BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
     58         count = 0;
     59         idx = -1;
     60         buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
     61         intBuffer = (NSInteger *)[buffer mutableBytes];
     62         SPARSE = NO;
     63     }
     64     return self;
     65 }
     66 
     67 - (id)initWithLen:(NSUInteger)aLen
     68 {
     69     self = [super init];
     70     if ( self != nil ) {
     71         BuffSize  = (ANTLR_INT_ARRAY_INITIAL_SIZE * (sizeof(NSInteger)/sizeof(id)));
     72         count = 0;
     73         idx = -1;
     74         buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
     75         intBuffer = (NSInteger *)[buffer mutableBytes];
     76         SPARSE = NO;
     77     }
     78     return self;
     79 }
     80 
     81 - (void)dealloc
     82 {
     83 #ifdef DEBUG_DEALLOC
     84     NSLog( @"called dealloc in ANTLRIntArray" );
     85 #endif
     86     if ( buffer ) [buffer release];
     87     [super dealloc];
     88 }
     89 
     90 - (id)copyWithZone:(NSZone *)aZone
     91 {
     92     ANTLRIntArray *copy;
     93     
     94     copy = [[[self class] alloc] initWithLen:BuffSize];
     95     copy.idx = self.idx;
     96     NSInteger anIndex;
     97     for ( anIndex = 0; anIndex < BuffSize; anIndex++ ) {
     98         [copy addInteger:intBuffer[anIndex]];
     99     }
    100     return copy;
    101 }
    102 
    103 - (NSUInteger)count
    104 {
    105     return count;
    106 }
    107 
    108 // FIXME: Java runtime returns p, I'm not so sure it's right so have added p + 1 to show true size!
    109 - (NSUInteger)size
    110 {
    111     if ( count > 0 )
    112         return ( count * sizeof(NSInteger));
    113     return 0;
    114 }
    115 
    116 - (void)addInteger:(NSInteger) value
    117 {
    118     [self ensureCapacity:idx+1];
    119     intBuffer[++idx] = (NSInteger) value;
    120     count++;
    121 }
    122 
    123 - (NSInteger)pop
    124 {
    125     if ( idx < 0 ) {
    126         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Nothing to pop, count = %d", count]];
    127     }
    128     NSInteger value = (NSInteger) intBuffer[idx--];
    129     count--;
    130     return value;
    131 }
    132 
    133 - (void)push:(NSInteger)aValue
    134 {
    135     [self addInteger:aValue];
    136 }
    137 
    138 - (NSInteger)integerAtIndex:(NSUInteger) anIndex
    139 {
    140     if ( SPARSE==NO  && anIndex > idx ) {
    141         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
    142     }
    143     else if ( SPARSE == YES && anIndex >= BuffSize ) {
    144         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
    145     }
    146     return intBuffer[anIndex];
    147 }
    148 
    149 - (void)insertInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
    150 {
    151     [self replaceInteger:aValue AtIndex:anIndex];
    152     count++;
    153 }
    154 
    155 - (NSInteger)removeIntegerAtIndex:(NSUInteger) anIndex
    156 {
    157     if ( SPARSE==NO && anIndex > idx ) {
    158         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
    159         return (NSInteger)-1;
    160     } else if ( SPARSE==YES && anIndex >= BuffSize ) {
    161         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
    162     }
    163     count--;
    164     return intBuffer[anIndex];
    165 }
    166 
    167 - (void)replaceInteger:(NSInteger)aValue AtIndex:(NSUInteger)anIndex
    168 {
    169     if ( SPARSE == NO && anIndex > idx ) {
    170         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than count %d", anIndex, count]];
    171     }
    172     else if ( SPARSE == YES && anIndex >= BuffSize ) {
    173         @throw [ANTLRIllegalArgumentException newException:[NSString stringWithFormat:@"Index %d must be less than BuffSize %d", anIndex, BuffSize]];
    174     }
    175     intBuffer[anIndex] = aValue;
    176 }
    177 
    178 -(void) reset
    179 {
    180     count = 0;
    181     idx = -1;
    182 }
    183 
    184 - (void) ensureCapacity:(NSUInteger) anIndex
    185 {
    186     if ( (anIndex * sizeof(NSUInteger)) >= [buffer length] )
    187     {
    188         NSUInteger newSize = ([buffer length] / sizeof(NSInteger)) * 2;
    189         if (anIndex > newSize) {
    190             newSize = anIndex + 1;
    191         }
    192         BuffSize = newSize;
    193         [buffer setLength:(BuffSize * sizeof(NSUInteger))];
    194         intBuffer = (NSInteger *)[buffer mutableBytes];
    195     }
    196 }
    197 
    198 @end
    199 
    200