xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/UniqueIDMap.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot//
2*16467b97STreehugger Robot//  UniqueIDMap.m
3*16467b97STreehugger Robot//  ANTLR
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot//  Created by Alan Condit on 7/7/10.
6*16467b97STreehugger Robot// [The "BSD licence"]
7*16467b97STreehugger Robot// Copyright (c) 2010 Alan Condit
8*16467b97STreehugger Robot// All rights reserved.
9*16467b97STreehugger Robot//
10*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without
11*16467b97STreehugger Robot// modification, are permitted provided that the following conditions
12*16467b97STreehugger Robot// are met:
13*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright
14*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer.
15*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright
16*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer in the
17*16467b97STreehugger Robot//    documentation and/or other materials provided with the distribution.
18*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products
19*16467b97STreehugger Robot//    derived from this software without specific prior written permission.
20*16467b97STreehugger Robot//
21*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot#import "UniqueIDMap.h"
33*16467b97STreehugger Robot#import "Tree.h"
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot@implementation UniqueIDMap
36*16467b97STreehugger Robot@synthesize lastHash;
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot+(id)newUniqueIDMap
39*16467b97STreehugger Robot{
40*16467b97STreehugger Robot    UniqueIDMap *aNewUniqueIDMap;
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot    aNewUniqueIDMap = [[UniqueIDMap alloc] init];
43*16467b97STreehugger Robot	return( aNewUniqueIDMap );
44*16467b97STreehugger Robot}
45*16467b97STreehugger Robot
46*16467b97STreehugger Robot+(id)newUniqueIDMapWithLen:(NSInteger)aBuffSize
47*16467b97STreehugger Robot{
48*16467b97STreehugger Robot    UniqueIDMap *aNewUniqueIDMap;
49*16467b97STreehugger Robot
50*16467b97STreehugger Robot    aNewUniqueIDMap = [[UniqueIDMap alloc] initWithLen:aBuffSize];
51*16467b97STreehugger Robot	return( aNewUniqueIDMap );
52*16467b97STreehugger Robot}
53*16467b97STreehugger Robot
54*16467b97STreehugger Robot-(id)init
55*16467b97STreehugger Robot{
56*16467b97STreehugger Robot    NSInteger idx;
57*16467b97STreehugger Robot
58*16467b97STreehugger Robot	if ((self = [super initWithLen:HASHSIZE]) != nil) {
59*16467b97STreehugger Robot		fNext = nil;
60*16467b97STreehugger Robot        for( idx = 0; idx < HASHSIZE; idx++ ) {
61*16467b97STreehugger Robot            ptrBuffer[idx] = nil;
62*16467b97STreehugger Robot        }
63*16467b97STreehugger Robot	}
64*16467b97STreehugger Robot    return( self );
65*16467b97STreehugger Robot}
66*16467b97STreehugger Robot
67*16467b97STreehugger Robot-(id)initWithLen:(NSInteger)aBuffSize
68*16467b97STreehugger Robot{
69*16467b97STreehugger Robot	if ((self = [super initWithLen:aBuffSize]) != nil) {
70*16467b97STreehugger Robot	}
71*16467b97STreehugger Robot    return( self );
72*16467b97STreehugger Robot}
73*16467b97STreehugger Robot
74*16467b97STreehugger Robot-(void)dealloc
75*16467b97STreehugger Robot{
76*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC
77*16467b97STreehugger Robot    NSLog( @"called dealloc in UniqueIDMap" );
78*16467b97STreehugger Robot#endif
79*16467b97STreehugger Robot    NodeMapElement *tmp, *rtmp;
80*16467b97STreehugger Robot    NSInteger idx;
81*16467b97STreehugger Robot
82*16467b97STreehugger Robot    if ( self.fNext != nil ) {
83*16467b97STreehugger Robot        for( idx = 0; idx < HASHSIZE; idx++ ) {
84*16467b97STreehugger Robot            tmp = ptrBuffer[idx];
85*16467b97STreehugger Robot            while ( tmp ) {
86*16467b97STreehugger Robot                rtmp = tmp;
87*16467b97STreehugger Robot                tmp = (NodeMapElement *)tmp.fNext;
88*16467b97STreehugger Robot                [rtmp release];
89*16467b97STreehugger Robot            }
90*16467b97STreehugger Robot        }
91*16467b97STreehugger Robot    }
92*16467b97STreehugger Robot	[super dealloc];
93*16467b97STreehugger Robot}
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot-(void)deleteUniqueIDMap:(NodeMapElement *)np
96*16467b97STreehugger Robot{
97*16467b97STreehugger Robot    NodeMapElement *tmp, *rtmp;
98*16467b97STreehugger Robot    NSInteger idx;
99*16467b97STreehugger Robot
100*16467b97STreehugger Robot    if ( self.fNext != nil ) {
101*16467b97STreehugger Robot        for( idx = 0; idx < HASHSIZE; idx++ ) {
102*16467b97STreehugger Robot            tmp = ptrBuffer[idx];
103*16467b97STreehugger Robot            while ( tmp ) {
104*16467b97STreehugger Robot                rtmp = tmp;
105*16467b97STreehugger Robot                tmp = tmp.fNext;
106*16467b97STreehugger Robot                [rtmp release];
107*16467b97STreehugger Robot            }
108*16467b97STreehugger Robot        }
109*16467b97STreehugger Robot    }
110*16467b97STreehugger Robot}
111*16467b97STreehugger Robot
112*16467b97STreehugger Robot- (void)clear
113*16467b97STreehugger Robot{
114*16467b97STreehugger Robot    NodeMapElement *tmp, *rtmp;
115*16467b97STreehugger Robot    NSInteger idx;
116*16467b97STreehugger Robot
117*16467b97STreehugger Robot    for( idx = 0; idx < HASHSIZE; idx++ ) {
118*16467b97STreehugger Robot        tmp = ptrBuffer[idx];
119*16467b97STreehugger Robot        while ( tmp ) {
120*16467b97STreehugger Robot            rtmp = tmp;
121*16467b97STreehugger Robot            tmp = [tmp getfNext];
122*16467b97STreehugger Robot            [rtmp release];
123*16467b97STreehugger Robot        }
124*16467b97STreehugger Robot        ptrBuffer[idx] = nil;
125*16467b97STreehugger Robot    }
126*16467b97STreehugger Robot}
127*16467b97STreehugger Robot
128*16467b97STreehugger Robot- (NSInteger)count
129*16467b97STreehugger Robot{
130*16467b97STreehugger Robot    id anElement;
131*16467b97STreehugger Robot    NSInteger aCnt = 0;
132*16467b97STreehugger Robot
133*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++) {
134*16467b97STreehugger Robot        if ((anElement = ptrBuffer[i]) != nil) {
135*16467b97STreehugger Robot            aCnt += (NSInteger)[anElement count];
136*16467b97STreehugger Robot        }
137*16467b97STreehugger Robot    }
138*16467b97STreehugger Robot    return aCnt;
139*16467b97STreehugger Robot}
140*16467b97STreehugger Robot
141*16467b97STreehugger Robot- (NSInteger)size
142*16467b97STreehugger Robot{
143*16467b97STreehugger Robot    return BuffSize;
144*16467b97STreehugger Robot}
145*16467b97STreehugger Robot
146*16467b97STreehugger Robot-(void)delete_chain:(NodeMapElement *)np
147*16467b97STreehugger Robot{
148*16467b97STreehugger Robot    if ( np.fNext != nil )
149*16467b97STreehugger Robot		[self delete_chain:np.fNext];
150*16467b97STreehugger Robot	[np release];
151*16467b97STreehugger Robot}
152*16467b97STreehugger Robot
153*16467b97STreehugger Robot- (id)getNode:(id<BaseTree>)aNode
154*16467b97STreehugger Robot{
155*16467b97STreehugger Robot    NodeMapElement *np;
156*16467b97STreehugger Robot    NSInteger idx;
157*16467b97STreehugger Robot
158*16467b97STreehugger Robot    idx = [(id<BaseTree>)aNode type];
159*16467b97STreehugger Robot    np = ptrBuffer[idx];
160*16467b97STreehugger Robot    while ( np != nil ) {
161*16467b97STreehugger Robot        if (np.node == aNode) {
162*16467b97STreehugger Robot            return( np.index );
163*16467b97STreehugger Robot        }
164*16467b97STreehugger Robot        np = np.fNext;
165*16467b97STreehugger Robot    }
166*16467b97STreehugger Robot    return( nil );
167*16467b97STreehugger Robot}
168*16467b97STreehugger Robot
169*16467b97STreehugger Robot- (void)putID:(id)anID Node:(id<BaseTree>)aNode
170*16467b97STreehugger Robot{
171*16467b97STreehugger Robot    NodeMapElement *np, *np1;
172*16467b97STreehugger Robot    NSInteger idx;
173*16467b97STreehugger Robot
174*16467b97STreehugger Robot    idx = [(id<BaseTree>)aNode type];
175*16467b97STreehugger Robot    idx %= HASHSIZE;
176*16467b97STreehugger Robot    np = [[NodeMapElement newNodeMapElementWithIndex:anID Node:aNode] retain];
177*16467b97STreehugger Robot    np1 = ptrBuffer[idx];
178*16467b97STreehugger Robot    np.fNext = np1;
179*16467b97STreehugger Robot    ptrBuffer[idx] = np;
180*16467b97STreehugger Robot    return;
181*16467b97STreehugger Robot}
182*16467b97STreehugger Robot
183*16467b97STreehugger Robot
184*16467b97STreehugger Robot@end
185