1//
2//  ANTLRRewriteRuleNodeStream.m
3//  ANTLR
4//
5//  Created by Kay Röpke on 7/16/07.
6//  Copyright 2007 classDump. All rights reserved.
7//
8
9#import "ANTLRRewriteRuleNodeStream.h"
10#import "ANTLRRuntimeException.h"
11
12@implementation ANTLRRewriteRuleNodeStream
13
14+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription;
15{
16    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription];
17}
18
19+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNodeStream:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement;
20{
21    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement];
22}
23
24+ (ANTLRRewriteRuleNodeStream*) newANTLRRewriteRuleNode:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements;
25{
26    return [[ANTLRRewriteRuleNodeStream alloc] initWithTreeAdaptor:aTreeAdaptor description:anElementDescription elements:theElements];
27}
28
29- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription
30{
31    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription]) != nil) {
32        dirty = NO;
33        isSingleElement = YES;
34    }
35    return self;
36}
37
38- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription element:(id)anElement
39{
40    if ((self = [super initWithTreeAdaptor:aTreeAdaptor description:anElementDescription element:anElement]) != nil) {
41        dirty = NO;
42    }
43    return self;
44}
45
46- (id) initWithTreeAdaptor:(id<ANTLRTreeAdaptor>)aTreeAdaptor description:(NSString *)anElementDescription elements:(NSArray *)theElements
47{
48    if ((self = [super init]) != nil) {
49        dirty = NO;
50    }
51    return self;
52}
53
54
55- (id) nextNode
56{
57    if (dirty || (cursor >= [self size] && [self size] == 1))
58        return [treeAdaptor dupNode:[self _next]];
59    else 
60        return [self _next];
61}
62
63- (id<ANTLRBaseTree>) toTree:(id<ANTLRBaseTree>)element
64{
65    return [treeAdaptor dupNode:element];
66}
67
68- (id) dup:(id)element
69{
70    return [treeAdaptor dupTree:element];
71    @throw [ANTLRRuntimeException newException:@"ANTLRUnsupportedOperationException" reason:@"dup can't be called for a node stream."];
72}
73
74@end
75