Exemple #1
0
 public void SetWindow(
     ArrayDeque <TimeWindowPair> window,
     int size)
 {
     _window = window;
     _size   = size;
 }
Exemple #2
0
        /// <summary>
        ///     Flatten the vector of arrays to an array. Return null if an empty vector was passed, else
        ///     return an array containing all the events.
        /// </summary>
        /// <param name="eventVector">vector</param>
        /// <returns>array with all events</returns>
        public static EventBean[] Flatten(ArrayDeque<EventBean[]> eventVector)
        {
            if (eventVector.IsEmpty()) {
                return null;
            }

            if (eventVector.Count == 1) {
                return eventVector.First;
            }

            var totalElements = 0;
            foreach (var arr in eventVector) {
                if (arr != null) {
                    totalElements += arr.Length;
                }
            }

            if (totalElements == 0) {
                return null;
            }

            var result = new EventBean[totalElements];
            var destPos = 0;
            foreach (var arr in eventVector) {
                if (arr != null) {
                    Array.Copy(arr, 0, result, destPos, arr.Length);
                    destPos += arr.Length;
                }
            }

            return result;
        }
Exemple #3
0
        public static EventBean[] GetNewDataNonRemoved(
            EventBean[] newData,
            ISet<EventBean> removedEvents)
        {
            var filter = false;
            for (var i = 0; i < newData.Length; i++) {
                if (removedEvents.Contains(newData[i])) {
                    filter = true;
                }
            }

            if (!filter) {
                return newData;
            }

            if (newData.Length == 1) {
                return null;
            }

            var events = new ArrayDeque<EventBean>(newData.Length - 1);
            for (var i = 0; i < newData.Length; i++) {
                if (!removedEvents.Contains(newData[i])) {
                    events.Add(newData[i]);
                }
            }

            if (events.IsEmpty()) {
                return null;
            }

            return events.ToArray();
        }
Exemple #4
0
        public void TestObjectAndNull()
        {
            var testWindow = new ArrayDeque <TimeWindowPair>();

            var list1 = new ArrayDeque <EventBean>();

            list1.Add(events.Get("c"));
            list1.Add(events.Get("d"));
            AddToWindow(testWindow, 10L, list1);

            AddToWindow(testWindow, 20L, events.Get("a"));

            AddToWindow(testWindow, 30L, null);

            var list3 = new ArrayDeque <EventBean>();

            list3.Add(events.Get("e"));
            AddToWindow(testWindow, 40L, list3);

            IEnumerator <EventBean> enumerator = new TimeWindowEnumerator(testWindow);

            EPAssertionUtil.AssertEqualsExactOrder(new object[] {
                events.Get("c"), events.Get("d"), events.Get("a"), events.Get("e")
            }, enumerator);
        }
Exemple #5
0
        public void TestEmpty()
        {
            var testWindow = new ArrayDeque <TimeWindowPair>();
            IEnumerator <EventBean> enumerator = new TimeWindowEnumerator(testWindow);

            EPAssertionUtil.AssertEqualsExactOrder(null, enumerator);
        }
        // Filter and no-select
        public ICollection <EventBean> EvaluateGetCollEvents(
            EventBean[] eventsPerStream,
            bool newData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext context,
            ExprSubselectRowNode parent)
        {
            var events         = EventBeanUtility.AllocatePerStreamShift(eventsPerStream);
            var evaluateParams = new EvaluateParams(events, true, context);

            ArrayDeque <EventBean> filtered = null;

            foreach (var subselectEvent in matchingEvents)
            {
                events[0] = subselectEvent;
                var pass = parent.FilterExpr.Evaluate(evaluateParams);
                if ((pass != null) && true.Equals(pass))
                {
                    if (filtered == null)
                    {
                        filtered = new ArrayDeque <EventBean>();
                    }
                    filtered.Add(subselectEvent);
                }
            }
            return(filtered);
        }
Exemple #7
0
        public ArrayDeque<Token> Tokenize(string str)
        {
            var tokens = new ArrayDeque<Token>(4);
            while (!str.Equals("")) {
                var match = false;
                foreach (var info in tokenInfos) {
                    var m = info.regex.Match(str);
                    if (m != Match.Empty) {
                        match = true;

                        var tok = m.Value.Trim();
                        tokens.Add(new Token(info.token, tok));

                        str = info.regex.Replace(str, "", 1).Trim();
                        break;
                    }
                }

                if (!match) {
                    throw new PropertyParseNodepException("Unexpected token '" + str + "'");
                }
            }

            return tokens;
        }
Exemple #8
0
        /// <summary>
        /// The Graham Scan algorithm determines the points belonging to the convex hull in O(n lg n).
        /// </summary>
        /// <param name="points">set of points</param>
        /// <returns>points in the convex hull</returns>
        /// <seealso href="http://en.wikipedia.org/wiki/Graham_scan">Graham scan, Wikipedia</seealso>
        public static List <Point> GrahamScan(List <Point> points)
        {
            if (points.Count <= 3)
            {
                return(new List <Point>(points));
            }

            var ps = new List <Point>(points);

            ps.Sort(new CompareYThenX());
            ps.Sort(new PolarComparator(ps[0]));

            Deque <Point> hull = new ArrayDeque <Point>();

            hull.Push(ps[0]);
            hull.Push(ps[1]);
            hull.Push(ps[2]);

            for (int i = 3; i < points.Count; i++)
            {
                var top = hull.Pop();
                while (hull.Any() && !IsLeftTurn(hull.Peek(), top, ps[i]))
                {
                    top = hull.Pop();
                }
                hull.Push(top);
                hull.Push(ps[i]);
            }

            return(new List <Point>(hull));
        }
Exemple #9
0
        protected long EvaluateInternal(
            EventBean theEvent,
            ICollection<FilterHandle> matches,
            int statementId,
            ExprEvaluatorContext ctx)
        {
            var version = filtersVersion;
            numEventsEvaluated.IncrementAndGet();

            var allMatches = new ArrayDeque<FilterHandle>();

            // Finds all matching filters
            RetryableMatchEvent(theEvent, allMatches, ctx);

            // Add statement matches to collection passed
            foreach (var match in allMatches) {
                if (match.StatementId == statementId) {
                    matches.Add(match);
                }
            }

            if (AuditPath.isAuditEnabled && !filterServiceListeners.IsEmpty()) {
                foreach (var listener in filterServiceListeners) {
                    listener.Filtering(theEvent, matches, statementId);
                }
            }

            return version;
        }
        public void TestFlattenList()
        {
            // test many arrays
            var testEvents  = MakeEventArray(new[] { "a1", "a2", "b1", "b2", "b3", "c1", "c2" });
            var eventVector = new ArrayDeque <UniformPair <EventBean[]> >();

            eventVector.Add(new UniformPair <EventBean[]>(null, new[] { testEvents[0], testEvents[1] }));
            eventVector.Add(new UniformPair <EventBean[]>(new[] { testEvents[2] }, null));
            eventVector.Add(new UniformPair <EventBean[]>(null, new[] { testEvents[3], testEvents[4], testEvents[5] }));
            eventVector.Add(new UniformPair <EventBean[]>(new[] { testEvents[6] }, null));

            var events = EventBeanUtility.FlattenList(eventVector);

            EPAssertionUtil.AssertEqualsExactOrder(new[] { testEvents[2], testEvents[6] }, events.First);
            EPAssertionUtil.AssertEqualsExactOrder(new[] { testEvents[0], testEvents[1], testEvents[3], testEvents[4], testEvents[5] }, events.Second);

            // test just one array
            eventVector.Clear();
            eventVector.Add(new UniformPair <EventBean[]>(new[] { testEvents[2] }, null));
            events = EventBeanUtility.FlattenList(eventVector);
            EPAssertionUtil.AssertEqualsExactOrder(new[] { testEvents[2] }, events.First);
            EPAssertionUtil.AssertEqualsExactOrder((object[])null, events.Second);

            // test empty vector
            eventVector.Clear();
            events = EventBeanUtility.FlattenList(eventVector);
            Assert.IsNull(events);
        }
        public void TestFlatten()
        {
            // test many arrays
            var testEvents  = MakeEventArray(new[] { "a1", "a2", "b1", "b2", "b3", "c1", "c2" });
            var eventVector = new ArrayDeque <EventBean[]>();

            eventVector.Add(new[] { testEvents[0], testEvents[1] });
            eventVector.Add(new[] { testEvents[2] });
            eventVector.Add(new[] { testEvents[3], testEvents[4], testEvents[5] });
            eventVector.Add(new[] { testEvents[6] });

            var events = EventBeanUtility.Flatten(eventVector);

            Assert.AreEqual(7, events.Length);
            for (var i = 0; i < testEvents.Length; i++)
            {
                Assert.AreEqual(events[i], testEvents[i]);
            }

            // test just one array
            eventVector.Clear();
            eventVector.Add(new[] { testEvents[2] });
            events = EventBeanUtility.Flatten(eventVector);
            Assert.AreEqual(events[0], testEvents[2]);

            // test empty vector
            eventVector.Clear();
            events = EventBeanUtility.Flatten(eventVector);
            Assert.IsNull(events);
        }
        public object Evaluate(
            EventBean[] eventsPerStream,
            bool isNewData,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            var array = (Array) rootEvaluator.Evaluate(eventsPerStream, isNewData, exprEvaluatorContext);
            if (array == null) {
                return null;
            }

            var len = array.Length;
            if (len == 0) {
                return Collections.GetEmptyList<object>();
            }

            if (len == 1) {
                return Collections.SingletonList(array.GetValue(0));
            }

            Deque<object> dq = new ArrayDeque<object>(len);
            for (var i = 0; i < len; i++) {
                dq.Add(array.GetValue(i));
            }

            return dq;
        }
        public void Lookup(
            EventBean[] lookupEvents,
            ICollection<MultiKeyArrayOfKeys<EventBean>> joinSet,
            ExprEvaluatorContext exprEvaluatorContext)
        {
            if (lookupEvents == null || lookupEvents.Length == 0) {
                return;
            }

            var results = new ArrayDeque<EventBean[]>();
            foreach (var theEvent in lookupEvents) {
                // Set up prototype row
                var prototype = new EventBean[NumStreams];
                prototype[ForStream] = theEvent;

                // Perform execution
                ExecNode.Process(theEvent, prototype, results, exprEvaluatorContext);

                // Convert results into unique set
                foreach (var row in results) {
                    joinSet.Add(new MultiKeyArrayOfKeys<EventBean>(row));
                }

                results.Clear();
            }
        }
        public static bool EvaluateFilterForStatement(EPServicesContext servicesContext, EventBean theEvent, AgentInstanceContext agentInstanceContext, FilterHandle filterHandle)
        {
            // context was created - reevaluate for the given event
            var callbacks = new ArrayDeque <FilterHandle>();

            servicesContext.FilterService.Evaluate(theEvent, callbacks, agentInstanceContext.StatementContext.StatementId);

            try
            {
                servicesContext.VariableService.SetLocalVersion();

                // sub-selects always go first
                if (callbacks.Any(handle => handle == filterHandle))
                {
                    return(true);
                }

                agentInstanceContext.EpStatementAgentInstanceHandle.InternalDispatch();
            }
            catch (Exception ex)
            {
                servicesContext.ExceptionHandlingService.HandleException(
                    ex, agentInstanceContext.EpStatementAgentInstanceHandle, ExceptionHandlerExceptionType.PROCESS,
                    theEvent);
            }

            return(false);
        }
        public static AnnotationPart[] AnnotationsFromSpec(PatternStreamSpecRaw pattern)
        {
            Deque <AnnotationPart> parts = null;

            if (pattern.IsDiscardPartialsOnMatch)
            {
                parts = new ArrayDeque <AnnotationPart>();
                parts.Add(new AnnotationPart(DISCARDPARTIALSONMATCH));
            }

            if (pattern.IsSuppressSameEventMatches)
            {
                if (parts == null)
                {
                    parts = new ArrayDeque <AnnotationPart>();
                }
                parts.Add(new AnnotationPart(SUPPRESSOVERLAPPINGMATCHES));
            }

            if (parts == null)
            {
                return(null);
            }
            return(parts.ToArray());
        }
        public override ICollection <EventBean> EvaluateGetCollEvents(
            EventBean[] eventsPerStream,
            bool newData,
            ICollection <EventBean> matchingEvents,
            ExprEvaluatorContext context,
            ExprSubselectRowNode parent)
        {
            ICollection <object> groupKeys = parent.SubselectAggregationService.GetGroupKeys(context);

            if (groupKeys.IsEmpty())
            {
                return(null);
            }
            ICollection <EventBean> events = new ArrayDeque <EventBean>(groupKeys.Count);

            foreach (object groupKey in groupKeys)
            {
                parent.SubselectAggregationService.SetCurrentAccess(groupKey, context.AgentInstanceId, null);
                IDictionary <string, object> row = parent.EvaluateRow(null, true, context);
                EventBean @event = parent.subselectMultirowType.EventAdapterService.AdapterForTypedMap(
                    row, parent.subselectMultirowType.EventType);
                events.Add(@event);
            }
            return(events);
        }
Exemple #17
0
        public object EvaluateEnumMethod(
            EventBean[] eventsLambda,
            ICollection<object> enumcoll,
            bool isNewData,
            ExprEvaluatorContext context)
        {
            if (enumcoll.IsEmpty()) {
                return enumcoll;
            }

            var result = new ArrayDeque<object>();
            var evalEvent = new ObjectArrayEventBean(new object[1], _forge.evalEventType);
            eventsLambda[_forge.streamNumLambda] = evalEvent;
            var evalProps = evalEvent.Properties;
            var indexEvent = new ObjectArrayEventBean(new object[1], _forge.indexEventType);
            eventsLambda[_forge.streamNumLambda + 1] = indexEvent;
            var indexProps = indexEvent.Properties;

            var count = -1;
            foreach (var next in enumcoll) {
                count++;
                evalProps[0] = next;
                indexProps[0] = count;

                var pass = _innerExpression.Evaluate(eventsLambda, isNewData, context);
                if (pass == null || false.Equals(pass)) {
                    continue;
                }

                result.Add(next);
            }

            return result;
        }
Exemple #18
0
        protected long EvaluateInternal(EventBean theEvent, ICollection <FilterHandle> matches, String statementId)
        {
            long version = _filtersVersion;

            Interlocked.Increment(ref _numEventsEvaluated);
            //_numEventsEvaluated.IncrementAndGet();

            ArrayDeque <FilterHandle> allMatches = new ArrayDeque <FilterHandle>();

            // Finds all matching filters
            RetryableMatchEvent(theEvent, allMatches);

            // Add statement matches to collection passed
            foreach (FilterHandle match in allMatches)
            {
                if (match.StatementId.Equals(statementId))
                {
                    matches.Add(match);
                }
            }

            if ((AuditPath.IsAuditEnabled) && (_filterServiceListeners.IsNotEmpty()))
            {
                foreach (FilterServiceListener listener in _filterServiceListeners)
                {
                    listener.Filtering(theEvent, matches, statementId);
                }
            }

            return(version);
        }
        private ICollection <EventBean> GetFiltered(ICollection <EventBean> snapshot, IList <ExprNode> filterExpressions)
        {
            var deque = new ArrayDeque <EventBean>(Math.Min(snapshot.Count, 16));

            ExprNodeUtility.ApplyFilterExpressionsIterable(snapshot, filterExpressions, _agentInstanceContext, deque);
            return(deque);
        }
Exemple #20
0
        /// <summary>
        ///     NOTE: Code-generation-invoked method, method name and parameter order matters
        /// </summary>
        /// <param name="sort">sorted</param>
        /// <param name="hasColl">collection flag</param>
        /// <param name="descending">true for descending</param>
        /// <returns>collection</returns>
        public static ICollection<object> EnumOrderBySortEval(
            OrderedDictionary<object, object> sort,
            bool hasColl,
            bool descending)
        {
            IDictionary<object, object> sorted;
            if (descending) {
                sorted = sort.Invert();
            }
            else {
                sorted = sort;
            }

            if (!hasColl) {
                return sorted.Values;
            }

            Deque<object> coll = new ArrayDeque<object>();
            foreach (var entry in sorted) {
                if (entry.Value.GetType().IsGenericCollection()) {
                    coll.AddAll(entry.Value.Unwrap<object>());
                }
                else {
                    coll.Add(entry.Value);
                }
            }

            return coll;
        }
Exemple #21
0
        public virtual bool doesChildExistAtScope(Node child)
        {
            Deque <string> tempScope = new ArrayDeque <string>();

            tempScope.push(currentScope.pop());
            bool doesExist = false;

            while (!currentScope.Empty)
            {
                if (child is VariableNode)
                {
//JAVA TO C# CONVERTER TODO TASK: Java lambdas satisfy functional interfaces, while .NET lambdas satisfy delegates - change the appropriate interface to a delegate:
                    doesExist = scopeHash[tempScope.peek()].children.stream().filter(f => f is VariableNode).filter(t => ((VariableNode)t).variableName.Equals(((VariableNode)child).variableName)).count() == 1;
                }
                else if (child is UserDefinedTypeNode)
                {
//JAVA TO C# CONVERTER TODO TASK: Java lambdas satisfy functional interfaces, while .NET lambdas satisfy delegates - change the appropriate interface to a delegate:
                    doesExist = scopeHash[tempScope.peek()].children.stream().filter(f => f is UserDefinedTypeNode).filter(t => ((VariableNode)t).variableName.Equals(((UserDefinedTypeNode)child).TypeName)).count() == 1;
                }
                if (doesExist)
                {
                    break;
                }

                tempScope.push(currentScope.pop());
            }


            while (!tempScope.Empty)
            {
                currentScope.push(tempScope.pop());
            }

            return(doesExist);
        }
Exemple #22
0
        public object EvaluateEnumMethod(
            EventBean[] eventsLambda,
            ICollection<object> enumcoll,
            bool isNewData,
            ExprEvaluatorContext context)
        {
            var sort = new OrderedDictionary<object, object>();
            var hasColl = false;

            var beans = (ICollection<EventBean>) enumcoll;
            foreach (var next in beans) {
                eventsLambda[_forge.StreamNumLambda] = next;

                var comparable = (IComparable) _innerExpression.Evaluate(eventsLambda, isNewData, context);
                var entry = sort.Get(comparable);

                if (entry == null) {
                    sort.Put(comparable, next);
                    continue;
                }

                if (entry is ICollection<EventBean>) {
                    ((ICollection<EventBean>) entry).Add(next);
                    continue;
                }

                Deque<object> coll = new ArrayDeque<object>(2);
                coll.Add(entry);
                coll.Add(next);
                sort.Put(comparable, coll);
                hasColl = true;
            }

            return EnumOrderBySortEval(sort, hasColl, _forge.descending);
        }
Exemple #23
0
 private void AddToWindow(
     ArrayDeque <TimeWindowPair> testWindow,
     long key,
     object value)
 {
     testWindow.Add(new TimeWindowPair(key, value));
 }
Exemple #24
0
        private void Sweep(long currentTime)
        {
            var removed = new ArrayDeque <Object>();

            foreach (var entry in _subViewsPerKey)
            {
                var age = currentTime - entry.Value.LastUpdateTime;
                if (age > _reclaimMaxAge)
                {
                    removed.Add(entry.Key);
                }
            }

            foreach (var key in removed)
            {
                var entry         = _subViewsPerKey.Delete(key);
                var subviewHolder = entry.SubviewHolder;
                if (subviewHolder is IList <View> )
                {
                    var subviews = (IList <View>)subviewHolder;
                    foreach (var view in subviews)
                    {
                        RemoveSubview(view);
                    }
                }
                else if (subviewHolder is View)
                {
                    RemoveSubview((View)subviewHolder);
                }
            }
        }
Exemple #25
0
        public void TestEmptyListFront()
        {
            var testWindow = new ArrayDeque <TimeWindowPair>();

            var list1 = new ArrayDeque <EventBean>();

            AddToWindow(testWindow, 10L, list1);

            var list2 = new ArrayDeque <EventBean>();

            list2.Add(events.Get("a"));
            AddToWindow(testWindow, 15L, list2);

            var list3 = new ArrayDeque <EventBean>();

            list3.Add(events.Get("c"));
            list3.Add(events.Get("d"));
            AddToWindow(testWindow, 20L, list3);

            var list4 = new ArrayDeque <EventBean>();

            list4.Add(events.Get("e"));
            AddToWindow(testWindow, 40L, list4);

            IEnumerator <EventBean> enumerator = new TimeWindowEnumerator(testWindow);

            EPAssertionUtil.AssertEqualsExactOrder(new object[] {
                events.Get("a"), events.Get("c"), events.Get("d"), events.Get("e")
            }, enumerator);
        }
Exemple #26
0
        public void TestArrayLast()
        {
            var deque = new ArrayDeque <int>();

            Assert.That(deque.Count, Is.EqualTo(0));

            deque.Add(1);
            Assert.That(deque.Count, Is.EqualTo(1));
            Assert.That(deque.Last, Is.EqualTo(1));

            deque.Add(2);
            Assert.That(deque.Count, Is.EqualTo(2));
            Assert.That(deque.Last, Is.EqualTo(2));

            deque.Add(3);
            Assert.That(deque.Count, Is.EqualTo(3));
            Assert.That(deque.Last, Is.EqualTo(3));

            deque.Add(4);
            Assert.That(deque.Count, Is.EqualTo(4));
            Assert.That(deque.Last, Is.EqualTo(4));

            Assert.That(deque.RemoveFirst(), Is.EqualTo(1));
            Assert.That(deque.Count, Is.EqualTo(3));
            Assert.That(deque.Last, Is.EqualTo(4));

            Assert.That(deque.RemoveLast(), Is.EqualTo(4));
            Assert.That(deque.Count, Is.EqualTo(2));
            Assert.That(deque.Last, Is.EqualTo(3));
        }
Exemple #27
0
        public static ICollection<EventBean> GetDistinctByProp(
            ArrayDeque<EventBean> events,
            EventPropertyValueGetter getter)
        {
            if (events == null || events.IsEmpty()) {
                return new EventBean[0];
            }

            if (events.Count < 2) {
                return events;
            }

            var map = new LinkedHashMap<object, EventBean>();
            if (events.First is NaturalEventBean) {
                foreach (var theEvent in events) {
                    var inner = ((NaturalEventBean) theEvent).OptionalSynthetic;
                    var key = getter.Get(inner);
                    map[key] = inner;
                }
            }
            else {
                foreach (var theEvent in events) {
                    var key = getter.Get(theEvent);
                    map[key] = theEvent;
                }
            }

            return map.Values.ToArray();
        }
        public static IEnumerator<EventBean> For(
            IEnumerator<EventBean> sourceIterator,
            EventPropertyValueGetter distinctKeyGetter)
        {
            if (sourceIterator != null && sourceIterator.MoveNext()) {
                // there is at least one event...
                var first = sourceIterator.Current;
                // but is there only one event?
                if (!sourceIterator.MoveNext()) {
                    return EnumerationHelper.Singleton(first);
                }

                // build distinct set because there are multiple events
                var events = new ArrayDeque<EventBean>();
                events.Add(first);
                events.Add(sourceIterator.Current);
                while (sourceIterator.MoveNext()) {
                    events.Add(sourceIterator.Current);
                }

                // Determine the reader that we need to use for this use case
                var unique = EventBeanUtility.GetDistinctByProp(events, distinctKeyGetter);
                return unique.GetEnumerator();
            }

            return EnumerationHelper.Empty<EventBean>();
        }
Exemple #29
0
        public static EventBean[] GetNewDataNonRemoved(
            EventBean[] newData,
            ISet<EventBean> removedEvents,
            EventBean[][] newEventsPerView)
        {
            if (newData == null || newData.Length == 0) {
                return null;
            }

            if (newData.Length == 1) {
                if (removedEvents.Contains(newData[0])) {
                    return null;
                }

                var pass = FindEvent(newData[0], newEventsPerView);
                return pass ? newData : null;
            }

            var events = new ArrayDeque<EventBean>(newData.Length - 1);
            for (var i = 0; i < newData.Length; i++) {
                if (!removedEvents.Contains(newData[i])) {
                    var pass = FindEvent(newData[i], newEventsPerView);
                    if (pass) {
                        events.Add(newData[i]);
                    }
                }
            }

            if (events.IsEmpty()) {
                return null;
            }

            return events.ToArray();
        }
 public void Remove()
 {
     if (ExpectedModCount != outerInstance.ModCount)
     {
         throw new ConcurrentModificationException();
     }
     if (LastRet != -1)
     {
         E moved = OuterInstance.RemoveAt(LastRet);
         LastRet = -1;
         if (moved == null)
         {
             Cursor--;
         }
         else
         {
             if (ForgetMeNot == null)
             {
                 ForgetMeNot = new ArrayDeque <>();
             }
             ForgetMeNot.Add(moved);
         }
     }
     else if (LastRetElt != null)
     {
         OuterInstance.RemoveEq(LastRetElt);
         LastRetElt = null;
     }
     else
     {
         throw new IllegalStateException();
     }
     ExpectedModCount = outerInstance.ModCount;
 }