xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/PtrBuffer.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot//
2*16467b97STreehugger Robot//  PtrBuffer.m
3*16467b97STreehugger Robot//  ANTLR
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot//  Created by Alan Condit on 6/9/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#define SUCCESS (0)
33*16467b97STreehugger Robot#define FAILURE (-1)
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot#import "PtrBuffer.h"
36*16467b97STreehugger Robot#import "Tree.h"
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot/*
39*16467b97STreehugger Robot * Start of PtrBuffer
40*16467b97STreehugger Robot */
41*16467b97STreehugger Robot@implementation PtrBuffer
42*16467b97STreehugger Robot
43*16467b97STreehugger Robot@synthesize BuffSize;
44*16467b97STreehugger Robot@synthesize buffer;
45*16467b97STreehugger Robot@synthesize ptrBuffer;
46*16467b97STreehugger Robot@synthesize count;
47*16467b97STreehugger Robot@synthesize ptr;
48*16467b97STreehugger Robot
49*16467b97STreehugger Robot+(PtrBuffer *)newPtrBuffer
50*16467b97STreehugger Robot{
51*16467b97STreehugger Robot    return [[PtrBuffer alloc] init];
52*16467b97STreehugger Robot}
53*16467b97STreehugger Robot
54*16467b97STreehugger Robot+(PtrBuffer *)newPtrBufferWithLen:(NSInteger)cnt
55*16467b97STreehugger Robot{
56*16467b97STreehugger Robot    return [[PtrBuffer alloc] initWithLen:cnt];
57*16467b97STreehugger Robot}
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot-(id)init
60*16467b97STreehugger Robot{
61*16467b97STreehugger Robot    NSUInteger idx;
62*16467b97STreehugger Robot
63*16467b97STreehugger Robot    self = [super init];
64*16467b97STreehugger Robot    if ( self != nil ) {
65*16467b97STreehugger Robot        BuffSize  = BUFFSIZE;
66*16467b97STreehugger Robot        ptr = 0;
67*16467b97STreehugger Robot        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
68*16467b97STreehugger Robot        ptrBuffer = (id *) [buffer mutableBytes];
69*16467b97STreehugger Robot        for( idx = 0; idx < BuffSize; idx++ ) {
70*16467b97STreehugger Robot            ptrBuffer[idx] = nil;
71*16467b97STreehugger Robot        }
72*16467b97STreehugger Robot        count = 0;
73*16467b97STreehugger Robot    }
74*16467b97STreehugger Robot    return( self );
75*16467b97STreehugger Robot}
76*16467b97STreehugger Robot
77*16467b97STreehugger Robot-(id)initWithLen:(NSUInteger)cnt
78*16467b97STreehugger Robot{
79*16467b97STreehugger Robot    NSUInteger idx;
80*16467b97STreehugger Robot
81*16467b97STreehugger Robot    self = [super init];
82*16467b97STreehugger Robot    if ( self != nil ) {
83*16467b97STreehugger Robot        BuffSize  = cnt;
84*16467b97STreehugger Robot        ptr = 0;
85*16467b97STreehugger Robot        buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain];
86*16467b97STreehugger Robot        ptrBuffer = (id *)[buffer mutableBytes];
87*16467b97STreehugger Robot        for( idx = 0; idx < BuffSize; idx++ ) {
88*16467b97STreehugger Robot            ptrBuffer[idx] = nil;
89*16467b97STreehugger Robot        }
90*16467b97STreehugger Robot        count = 0;
91*16467b97STreehugger Robot    }
92*16467b97STreehugger Robot    return( self );
93*16467b97STreehugger Robot}
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot-(void)dealloc
96*16467b97STreehugger Robot{
97*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC
98*16467b97STreehugger Robot    NSLog( @"called dealloc in PtrBuffer" );
99*16467b97STreehugger Robot#endif
100*16467b97STreehugger Robot    LinkBase *tmp, *rtmp;
101*16467b97STreehugger Robot    NSInteger idx;
102*16467b97STreehugger Robot
103*16467b97STreehugger Robot    if ( self.fNext != nil ) {
104*16467b97STreehugger Robot        for( idx = 0; idx < BuffSize; idx++ ) {
105*16467b97STreehugger Robot            tmp = ptrBuffer[idx];
106*16467b97STreehugger Robot            while ( tmp ) {
107*16467b97STreehugger Robot                rtmp = tmp;
108*16467b97STreehugger Robot                if ([tmp isKindOfClass:[LinkBase class]])
109*16467b97STreehugger Robot                    tmp = (id)tmp.fNext;
110*16467b97STreehugger Robot                else
111*16467b97STreehugger Robot                    tmp = nil;
112*16467b97STreehugger Robot                [rtmp release];
113*16467b97STreehugger Robot            }
114*16467b97STreehugger Robot        }
115*16467b97STreehugger Robot    }
116*16467b97STreehugger Robot    [buffer release];
117*16467b97STreehugger Robot    [super dealloc];
118*16467b97STreehugger Robot}
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot- (id) copyWithZone:(NSZone *)aZone
121*16467b97STreehugger Robot{
122*16467b97STreehugger Robot    PtrBuffer *copy;
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot    copy = [[[self class] allocWithZone:aZone] init];
125*16467b97STreehugger Robot    if ( buffer )
126*16467b97STreehugger Robot        copy.buffer = [buffer copyWithZone:aZone];
127*16467b97STreehugger Robot    copy.ptrBuffer = ptrBuffer;
128*16467b97STreehugger Robot    copy.ptr = ptr;
129*16467b97STreehugger Robot    return copy;
130*16467b97STreehugger Robot}
131*16467b97STreehugger Robot
132*16467b97STreehugger Robot- (void)clear
133*16467b97STreehugger Robot{
134*16467b97STreehugger Robot    LinkBase *tmp, *rtmp;
135*16467b97STreehugger Robot    NSInteger idx;
136*16467b97STreehugger Robot
137*16467b97STreehugger Robot    for( idx = 0; idx < BuffSize; idx++ ) {
138*16467b97STreehugger Robot        tmp = ptrBuffer[idx];
139*16467b97STreehugger Robot        while ( tmp ) {
140*16467b97STreehugger Robot            rtmp = tmp;
141*16467b97STreehugger Robot            if ([tmp isKindOfClass:[LinkBase class]])
142*16467b97STreehugger Robot                tmp = (id)tmp.fNext;
143*16467b97STreehugger Robot            else
144*16467b97STreehugger Robot                tmp = nil;
145*16467b97STreehugger Robot            [rtmp dealloc];
146*16467b97STreehugger Robot        }
147*16467b97STreehugger Robot        ptrBuffer[idx] = nil;
148*16467b97STreehugger Robot    }
149*16467b97STreehugger Robot    count = 0;
150*16467b97STreehugger Robot}
151*16467b97STreehugger Robot
152*16467b97STreehugger Robot- (NSMutableData *)getBuffer
153*16467b97STreehugger Robot{
154*16467b97STreehugger Robot    return( buffer );
155*16467b97STreehugger Robot}
156*16467b97STreehugger Robot
157*16467b97STreehugger Robot- (void)setBuffer:(NSMutableData *)np
158*16467b97STreehugger Robot{
159*16467b97STreehugger Robot    buffer = np;
160*16467b97STreehugger Robot}
161*16467b97STreehugger Robot
162*16467b97STreehugger Robot- (NSUInteger)getCount
163*16467b97STreehugger Robot{
164*16467b97STreehugger Robot    return( count );
165*16467b97STreehugger Robot}
166*16467b97STreehugger Robot
167*16467b97STreehugger Robot- (void)setCount:(NSUInteger)aCount
168*16467b97STreehugger Robot{
169*16467b97STreehugger Robot    count = aCount;
170*16467b97STreehugger Robot}
171*16467b97STreehugger Robot
172*16467b97STreehugger Robot- (id *)getPtrBuffer
173*16467b97STreehugger Robot{
174*16467b97STreehugger Robot    return( ptrBuffer );
175*16467b97STreehugger Robot}
176*16467b97STreehugger Robot
177*16467b97STreehugger Robot- (void)setPtrBuffer:(id *)np
178*16467b97STreehugger Robot{
179*16467b97STreehugger Robot    ptrBuffer = np;
180*16467b97STreehugger Robot}
181*16467b97STreehugger Robot
182*16467b97STreehugger Robot- (NSUInteger)getPtr
183*16467b97STreehugger Robot{
184*16467b97STreehugger Robot    return( ptr );
185*16467b97STreehugger Robot}
186*16467b97STreehugger Robot
187*16467b97STreehugger Robot- (void)setPtr:(NSUInteger)aPtr
188*16467b97STreehugger Robot{
189*16467b97STreehugger Robot    ptr = aPtr;
190*16467b97STreehugger Robot}
191*16467b97STreehugger Robot
192*16467b97STreehugger Robot- (void) addObject:(id) v
193*16467b97STreehugger Robot{
194*16467b97STreehugger Robot    [self ensureCapacity:ptr];
195*16467b97STreehugger Robot    if ( v ) [v retain];
196*16467b97STreehugger Robot    ptrBuffer[ptr++] = v;
197*16467b97STreehugger Robot    count++;
198*16467b97STreehugger Robot}
199*16467b97STreehugger Robot
200*16467b97STreehugger Robot- (void) push:(id) v
201*16467b97STreehugger Robot{
202*16467b97STreehugger Robot    if ( ptr >= BuffSize - 1 ) {
203*16467b97STreehugger Robot        [self ensureCapacity:ptr];
204*16467b97STreehugger Robot    }
205*16467b97STreehugger Robot    if ( v ) [v retain];
206*16467b97STreehugger Robot    ptrBuffer[ptr++] = v;
207*16467b97STreehugger Robot    count++;
208*16467b97STreehugger Robot}
209*16467b97STreehugger Robot
210*16467b97STreehugger Robot- (id) pop
211*16467b97STreehugger Robot{
212*16467b97STreehugger Robot    id v = nil;
213*16467b97STreehugger Robot    if ( ptr > 0 ) {
214*16467b97STreehugger Robot        v = ptrBuffer[--ptr];
215*16467b97STreehugger Robot        ptrBuffer[ptr] = nil;
216*16467b97STreehugger Robot    }
217*16467b97STreehugger Robot    count--;
218*16467b97STreehugger Robot    if ( v ) [v release];
219*16467b97STreehugger Robot    return v;
220*16467b97STreehugger Robot}
221*16467b97STreehugger Robot
222*16467b97STreehugger Robot- (id) peek
223*16467b97STreehugger Robot{
224*16467b97STreehugger Robot    id v = nil;
225*16467b97STreehugger Robot    if ( ptr > 0 ) {
226*16467b97STreehugger Robot        v = ptrBuffer[ptr-1];
227*16467b97STreehugger Robot    }
228*16467b97STreehugger Robot    return v;
229*16467b97STreehugger Robot}
230*16467b97STreehugger Robot
231*16467b97STreehugger Robot- (NSUInteger)count
232*16467b97STreehugger Robot{
233*16467b97STreehugger Robot#ifdef DONTUSENOMO
234*16467b97STreehugger Robot    int cnt = 0;
235*16467b97STreehugger Robot
236*16467b97STreehugger Robot    for (NSInteger i = 0; i < BuffSize; i++ ) {
237*16467b97STreehugger Robot        if ( ptrBuffer[i] != nil ) {
238*16467b97STreehugger Robot            cnt++;
239*16467b97STreehugger Robot        }
240*16467b97STreehugger Robot    }
241*16467b97STreehugger Robot    if ( cnt != count ) count = cnt;
242*16467b97STreehugger Robot#endif
243*16467b97STreehugger Robot    return count;
244*16467b97STreehugger Robot}
245*16467b97STreehugger Robot
246*16467b97STreehugger Robot- (NSUInteger)length
247*16467b97STreehugger Robot{
248*16467b97STreehugger Robot    return BuffSize;
249*16467b97STreehugger Robot}
250*16467b97STreehugger Robot
251*16467b97STreehugger Robot- (NSUInteger)size
252*16467b97STreehugger Robot{
253*16467b97STreehugger Robot    NSUInteger aSize = 0;
254*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++ ) {
255*16467b97STreehugger Robot        if (ptrBuffer[i] != nil) {
256*16467b97STreehugger Robot            aSize += sizeof(id);
257*16467b97STreehugger Robot        }
258*16467b97STreehugger Robot    }
259*16467b97STreehugger Robot    return aSize;
260*16467b97STreehugger Robot}
261*16467b97STreehugger Robot
262*16467b97STreehugger Robot- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx
263*16467b97STreehugger Robot{
264*16467b97STreehugger Robot    if ( idx >= BuffSize ) {
265*16467b97STreehugger Robot        [self ensureCapacity:idx];
266*16467b97STreehugger Robot    }
267*16467b97STreehugger Robot    if ( aRule != ptrBuffer[idx] ) {
268*16467b97STreehugger Robot        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
269*16467b97STreehugger Robot        if ( aRule ) [aRule retain];
270*16467b97STreehugger Robot    }
271*16467b97STreehugger Robot    ptrBuffer[idx] = aRule;
272*16467b97STreehugger Robot    count++;
273*16467b97STreehugger Robot}
274*16467b97STreehugger Robot
275*16467b97STreehugger Robot- (id)objectAtIndex:(NSUInteger)idx
276*16467b97STreehugger Robot{
277*16467b97STreehugger Robot    if ( idx < BuffSize ) {
278*16467b97STreehugger Robot        return ptrBuffer[idx];
279*16467b97STreehugger Robot    }
280*16467b97STreehugger Robot    return nil;
281*16467b97STreehugger Robot}
282*16467b97STreehugger Robot
283*16467b97STreehugger Robot- (void)addObjectsFromArray:(PtrBuffer *)anArray
284*16467b97STreehugger Robot{
285*16467b97STreehugger Robot    NSInteger cnt, i;
286*16467b97STreehugger Robot    cnt = [anArray count];
287*16467b97STreehugger Robot    for( i = 0; i < cnt; i++) {
288*16467b97STreehugger Robot        id tmp = [anArray objectAtIndex:i];
289*16467b97STreehugger Robot        if ( tmp ) [tmp retain];
290*16467b97STreehugger Robot        [self insertObject:tmp atIndex:i];
291*16467b97STreehugger Robot    }
292*16467b97STreehugger Robot    count += cnt;
293*16467b97STreehugger Robot    return;
294*16467b97STreehugger Robot}
295*16467b97STreehugger Robot
296*16467b97STreehugger Robot- (void)removeAllObjects
297*16467b97STreehugger Robot{
298*16467b97STreehugger Robot    int i;
299*16467b97STreehugger Robot    for ( i = 0; i < BuffSize; i++ ) {
300*16467b97STreehugger Robot        if ( ptrBuffer[i] ) [ptrBuffer[i] release];
301*16467b97STreehugger Robot        ptrBuffer[i] = nil;
302*16467b97STreehugger Robot    }
303*16467b97STreehugger Robot    count = 0;
304*16467b97STreehugger Robot    ptr = 0;
305*16467b97STreehugger Robot}
306*16467b97STreehugger Robot
307*16467b97STreehugger Robot- (void)removeObjectAtIndex:(NSInteger)idx
308*16467b97STreehugger Robot{
309*16467b97STreehugger Robot    int i;
310*16467b97STreehugger Robot    if ( idx >= 0 && idx < count ) {
311*16467b97STreehugger Robot        if ( ptrBuffer[idx] ) [ptrBuffer[idx] release];
312*16467b97STreehugger Robot        for ( i = idx; i < count-1; i++ ) {
313*16467b97STreehugger Robot            ptrBuffer[i] = ptrBuffer[i+1];
314*16467b97STreehugger Robot        }
315*16467b97STreehugger Robot        ptrBuffer[i] = nil;
316*16467b97STreehugger Robot        count--;
317*16467b97STreehugger Robot    }
318*16467b97STreehugger Robot}
319*16467b97STreehugger Robot
320*16467b97STreehugger Robot- (void) ensureCapacity:(NSUInteger) anIndex
321*16467b97STreehugger Robot{
322*16467b97STreehugger Robot    if ((anIndex * sizeof(id)) >= [buffer length])
323*16467b97STreehugger Robot    {
324*16467b97STreehugger Robot        NSInteger newSize = ([buffer length] / sizeof(id)) * 2;
325*16467b97STreehugger Robot        if (anIndex > newSize) {
326*16467b97STreehugger Robot            newSize = anIndex + 1;
327*16467b97STreehugger Robot        }
328*16467b97STreehugger Robot        BuffSize = newSize;
329*16467b97STreehugger Robot        [buffer setLength:(BuffSize * sizeof(id))];
330*16467b97STreehugger Robot        ptrBuffer = [buffer mutableBytes];
331*16467b97STreehugger Robot    }
332*16467b97STreehugger Robot}
333*16467b97STreehugger Robot
334*16467b97STreehugger Robot- (NSString *) description
335*16467b97STreehugger Robot{
336*16467b97STreehugger Robot    NSMutableString *str;
337*16467b97STreehugger Robot    NSInteger idx, cnt;
338*16467b97STreehugger Robot    cnt = [self count];
339*16467b97STreehugger Robot    str = [NSMutableString stringWithCapacity:30];
340*16467b97STreehugger Robot    [str appendString:@"["];
341*16467b97STreehugger Robot    for (idx = 0; idx < cnt; idx++ ) {
342*16467b97STreehugger Robot        [str appendString:[[self objectAtIndex:idx] description]];
343*16467b97STreehugger Robot    }
344*16467b97STreehugger Robot    [str appendString:@"]"];
345*16467b97STreehugger Robot    return str;
346*16467b97STreehugger Robot}
347*16467b97STreehugger Robot
348*16467b97STreehugger Robot- (NSString *) toString
349*16467b97STreehugger Robot{
350*16467b97STreehugger Robot    return [self description];
351*16467b97STreehugger Robot}
352*16467b97STreehugger Robot
353*16467b97STreehugger Robot@end
354