1 // 2 // ANTLRUniqueIDMap.m 3 // ANTLR 4 // 5 // Created by Alan Condit on 7/7/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 #import "ANTLRUniqueIDMap.h" 33 #import "ANTLRTree.h" 34 35 @implementation ANTLRUniqueIDMap 36 @synthesize lastHash; 37 38 +(id)newANTLRUniqueIDMap 39 { 40 ANTLRUniqueIDMap *aNewANTLRUniqueIDMap; 41 42 aNewANTLRUniqueIDMap = [[ANTLRUniqueIDMap alloc] init]; 43 return( aNewANTLRUniqueIDMap ); 44 } 45 46 +(id)newANTLRUniqueIDMapWithLen:(NSInteger)aBuffSize 47 { 48 ANTLRUniqueIDMap *aNewANTLRUniqueIDMap; 49 50 aNewANTLRUniqueIDMap = [[ANTLRUniqueIDMap alloc] initWithLen:aBuffSize]; 51 return( aNewANTLRUniqueIDMap ); 52 } 53 54 -(id)init 55 { 56 NSInteger idx; 57 58 if ((self = [super initWithLen:HASHSIZE]) != nil) { 59 fNext = nil; 60 for( idx = 0; idx < HASHSIZE; idx++ ) { 61 ptrBuffer[idx] = nil; 62 } 63 } 64 return( self ); 65 } 66 67 -(id)initWithLen:(NSInteger)aBuffSize 68 { 69 if ((self = [super initWithLen:aBuffSize]) != nil) { 70 } 71 return( self ); 72 } 73 74 -(void)dealloc 75 { 76 #ifdef DEBUG_DEALLOC 77 NSLog( @"called dealloc in ANTLRUniqueIDMap" ); 78 #endif 79 ANTLRNodeMapElement *tmp, *rtmp; 80 NSInteger idx; 81 82 if ( self.fNext != nil ) { 83 for( idx = 0; idx < HASHSIZE; idx++ ) { 84 tmp = ptrBuffer[idx]; 85 while ( tmp ) { 86 rtmp = tmp; 87 tmp = (ANTLRNodeMapElement *)tmp.fNext; 88 [rtmp release]; 89 } 90 } 91 } 92 [super dealloc]; 93 } 94 95 -(void)deleteANTLRUniqueIDMap:(ANTLRNodeMapElement *)np 96 { 97 ANTLRNodeMapElement *tmp, *rtmp; 98 NSInteger idx; 99 100 if ( self.fNext != nil ) { 101 for( idx = 0; idx < HASHSIZE; idx++ ) { 102 tmp = ptrBuffer[idx]; 103 while ( tmp ) { 104 rtmp = tmp; 105 tmp = tmp.fNext; 106 [rtmp release]; 107 } 108 } 109 } 110 } 111 112 - (void)clear 113 { 114 ANTLRNodeMapElement *tmp, *rtmp; 115 NSInteger idx; 116 117 for( idx = 0; idx < HASHSIZE; idx++ ) { 118 tmp = ptrBuffer[idx]; 119 while ( tmp ) { 120 rtmp = tmp; 121 tmp = [tmp getfNext]; 122 [rtmp release]; 123 } 124 ptrBuffer[idx] = nil; 125 } 126 } 127 128 - (NSInteger)count 129 { 130 id anElement; 131 NSInteger aCnt = 0; 132 133 for (int i = 0; i < BuffSize; i++) { 134 if ((anElement = ptrBuffer[i]) != nil) { 135 aCnt += (NSInteger)[anElement count]; 136 } 137 } 138 return aCnt; 139 } 140 141 - (NSInteger)size 142 { 143 return BuffSize; 144 } 145 146 -(void)delete_chain:(ANTLRNodeMapElement *)np 147 { 148 if ( np.fNext != nil ) 149 [self delete_chain:np.fNext]; 150 [np release]; 151 } 152 153 - (id)getNode:(id<ANTLRBaseTree>)aNode 154 { 155 ANTLRNodeMapElement *np; 156 NSInteger idx; 157 158 idx = [(id<ANTLRBaseTree>)aNode type]; 159 np = ptrBuffer[idx]; 160 while ( np != nil ) { 161 if (np.node == aNode) { 162 return( np.index ); 163 } 164 np = np.fNext; 165 } 166 return( nil ); 167 } 168 169 - (void)putID:(id)anID Node:(id<ANTLRBaseTree>)aNode 170 { 171 ANTLRNodeMapElement *np, *np1; 172 NSInteger idx; 173 174 idx = [(id<ANTLRBaseTree>)aNode type]; 175 idx %= HASHSIZE; 176 np = [[ANTLRNodeMapElement newANTLRNodeMapElementWithIndex:anID Node:aNode] retain]; 177 np1 = ptrBuffer[idx]; 178 np.fNext = np1; 179 ptrBuffer[idx] = np; 180 return; 181 } 182 183 184 @end 185