00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #if DOTNET1
00037 namespace Antlr.Runtime.Tree
00038 {
00039 using System;
00040 using IList = System.Collections.IList;
00041
00042 public class RewriteRuleSubtreeStream : RewriteRuleElementStream
00043 {
00044 public RewriteRuleSubtreeStream(ITreeAdaptor adaptor, string elementDescription)
00045 : base(adaptor, elementDescription)
00046 {
00047 }
00048
00052 public RewriteRuleSubtreeStream(ITreeAdaptor adaptor, string elementDescription, object oneElement)
00053 : base(adaptor, elementDescription, oneElement)
00054 {
00055 }
00056
00060 public RewriteRuleSubtreeStream(ITreeAdaptor adaptor, string elementDescription, IList elements)
00061 : base(adaptor, elementDescription, elements)
00062 {
00063 }
00064
00081 public object NextNode()
00082 {
00083 int size = Size();
00084 if (dirty || ((cursor >= size) && (size == 1)))
00085 {
00086
00087
00088 object el = _Next();
00089 return adaptor.DupNode(el);
00090 }
00091
00092 object elem = _Next();
00093 return elem;
00094 }
00095
00096 override protected object Dup(object el)
00097 {
00098 return adaptor.DupTree(el);
00099 }
00100 }
00101 }
00102 #elif DOTNET2
00103 namespace Antlr.Runtime.Tree {
00104 using System;
00105 using System.Collections.Generic;
00106 using SpecializingType = System.Object;
00107
00108 #warning Check, if RewriteRuleSubtreeStream can be changed to take advantage of something more specific than object.
00113 public class RewriteRuleSubtreeStream : RewriteRuleElementStream<SpecializingType> {
00114
00115 #region private delegate object ProcessHandler(object o)
00120 private delegate object ProcessHandler(object o);
00121 #endregion
00122
00123 public RewriteRuleSubtreeStream(ITreeAdaptor adaptor, string elementDescription)
00124 : base(adaptor, elementDescription) {
00125 }
00126
00130 public RewriteRuleSubtreeStream(
00131 ITreeAdaptor adaptor,
00132 string elementDescription,
00133 SpecializingType oneElement
00134 ) : base(adaptor, elementDescription, oneElement) {
00135 }
00136
00138 public RewriteRuleSubtreeStream(
00139 ITreeAdaptor adaptor,
00140 string elementDescription,
00141 IList<SpecializingType> elements
00142 ) : base(adaptor, elementDescription, elements) {
00143 }
00144
00146 [Obsolete("This constructor is for internal use only and might be phased out soon. Use instead the one with IList<T>.")]
00147 public RewriteRuleSubtreeStream(
00148 ITreeAdaptor adaptor,
00149 string elementDescription,
00150 System.Collections.IList elements
00151 ) : base(adaptor, elementDescription, elements) {
00152 }
00153
00166 public object NextNode() {
00167
00168 return FetchObject(delegate(object o) { return adaptor.DupNode(o); });
00169 }
00170
00171 #region private object FetchObject(ProcessHandler ph)
00178 private object FetchObject(ProcessHandler ph) {
00179 if (RequiresDuplication()) {
00180
00181 return ph(_Next());
00182 }
00183
00184 return _Next();
00185 }
00186 #endregion
00187
00192 private bool RequiresDuplication() {
00193 int size = Size();
00194
00195 return dirty || ((cursor >= size) && (size == 1));
00196 }
00197
00198 #region public override object NextTree()
00209 public override object NextTree() {
00210
00211 return FetchObject(delegate(object o) { return Dup(o); });
00212 }
00213 #endregion
00214
00215
00222 private SpecializingType Dup(SpecializingType el) {
00223 return adaptor.DupTree(el);
00224 }
00225 }
00226 }
00227 #endif