Home | History | Annotate | Download | only in Framework
      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