19 using System.Collections.Generic;
23 namespace Lucene.Net.Analysis
77 private readonly LinkedList<WeakReference> sinks =
new LinkedList<WeakReference>();
87 return NewSinkTokenStream(ACCEPT_ALL_FILTER);
98 sinks.AddLast(
new WeakReference(sink));
109 if (!this.Factory.Equals(sink.
Factory))
111 throw new System.ArgumentException(
"The supplied sink is not compatible to this tee");
114 foreach (var impl
in this.CloneAttributes().GetAttributeImplsIterator())
116 sink.AddAttributeImpl(impl);
118 sinks.AddLast(
new WeakReference(sink));
126 public void ConsumeAllTokens()
128 while (IncrementToken())
133 public override bool IncrementToken()
135 if (input.IncrementToken())
139 foreach(WeakReference wr
in sinks)
144 if (sink.Accept(
this))
148 state = this.CaptureState();
150 sink.AddState(state);
160 public override void End()
163 State finalState = CaptureState();
164 foreach(WeakReference wr
in sinks)
169 sink.SetFinalState(finalState);
185 public virtual void Reset()
193 private readonly LinkedList<State> cachedStates =
new LinkedList<State>();
194 private State finalState;
201 this.filter = filter;
206 return filter.
Accept(source);
213 throw new System.SystemException(
"The tee must be consumed before sinks are consumed.");
215 cachedStates.AddLast(state);
220 this.finalState = finalState;
223 public override bool IncrementToken()
228 it = cachedStates.GetEnumerator();
236 State state = it.Current;
241 public override void End()
243 if (finalState != null)
245 RestoreState(finalState);
249 public override void Reset()
251 it = cachedStates.GetEnumerator();
254 protected override void Dispose(
bool disposing)
260 private static readonly SinkFilter ACCEPT_ALL_FILTER;
263 ACCEPT_ALL_FILTER =
new AnonymousClassSinkFilter();