1 // 2 // ANTLRFastQueue.m 3 // ANTLR 4 // 5 // Created by Ian Michell on 26/04/2010. 6 // [The "BSD licence"] 7 // Copyright (c) 2010 Ian Michell 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 #import "ANTLRFastQueue.h" 33 #import "ANTLRError.h" 34 #import "ANTLRRuntimeException.h" 35 36 @implementation ANTLRFastQueue 37 38 //@synthesize pool; 39 @synthesize data; 40 @synthesize p; 41 @synthesize range; 42 43 + (id) newANTLRFastQueue 44 { 45 return [[ANTLRFastQueue alloc] init]; 46 } 47 48 - (id) init 49 { 50 self = [super init]; 51 if ( self != nil ) { 52 data = [[AMutableArray arrayWithCapacity:100] retain]; 53 p = 0; 54 range = -1; 55 } 56 return self; 57 } 58 59 - (void) dealloc 60 { 61 #ifdef DEBUG_DEALLOC 62 NSLog( @"called dealloc in ANTLRFastQueue" ); 63 #endif 64 if ( data ) [data release]; 65 [super dealloc]; 66 } 67 68 - (id) copyWithZone:(NSZone *)aZone 69 { 70 ANTLRFastQueue *copy; 71 72 copy = [[[self class] allocWithZone:aZone] init]; 73 copy.data = [data copyWithZone:nil]; 74 copy.p = p; 75 copy.range = range; 76 return copy; 77 } 78 79 // FIXME: Java code has this, it doesn't seem like it needs to be there... Then again a lot of the code in the java runtime is not great... 80 - (void) reset 81 { 82 [self clear]; 83 } 84 85 - (void) clear 86 { 87 p = 0; 88 if ( [data count] ) 89 [data removeAllObjects]; 90 } 91 92 - (id) remove 93 { 94 id obj = [self objectAtIndex:0]; 95 p++; 96 // check to see if we have hit the end of the buffer 97 if ( p == [data count] ) { 98 // if we have, then we need to clear it out 99 [self clear]; 100 } 101 return obj; 102 } 103 104 - (void) addObject:(id) obj 105 { 106 [data addObject:obj]; 107 } 108 109 - (NSUInteger) count 110 { 111 return [data count]; 112 } 113 114 - (NSUInteger) size 115 { 116 return [data count] - p; 117 } 118 119 - (NSUInteger) range 120 { 121 return range; 122 } 123 124 - (id) head 125 { 126 return [self objectAtIndex:0]; 127 } 128 129 - (id) objectAtIndex:(NSUInteger) i 130 { 131 NSUInteger absIndex; 132 133 absIndex = p + i; 134 if ( absIndex >= [data count] ) { 135 @throw [ANTLRNoSuchElementException newException:[NSString stringWithFormat:@"queue index %d > last index %d", absIndex, [data count]-1]]; 136 } 137 if ( absIndex < 0 ) { 138 @throw [ANTLRNoSuchElementException newException:[NSString stringWithFormat:@"queue index %d < 0", absIndex]]; 139 } 140 if ( absIndex > range ) range = absIndex; 141 return [data objectAtIndex:absIndex]; 142 } 143 144 - (NSString *) toString 145 { 146 return [self description]; 147 } 148 149 - (NSString *) description 150 { 151 NSMutableString *buf = [NSMutableString stringWithCapacity:30]; 152 NSInteger n = [self size]; 153 for (NSInteger i = 0; i < n; i++) { 154 [buf appendString:[[self objectAtIndex:i] description]]; 155 if ((i + 1) < n) { 156 [buf appendString:@" "]; 157 } 158 } 159 return buf; 160 } 161 162 #ifdef DONTUSENOMO 163 - (NSAutoreleasePool *)getPool 164 { 165 return pool; 166 } 167 168 - (void)setPool:(NSAutoreleasePool *)aPool 169 { 170 pool = aPool; 171 } 172 #endif 173 174 @end 175