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