Exemplo n.º 1
0
        public override bool MoveNext()
        {
            while (iterator.MoveNext())
            {
                bool match = false;
                switch (predicate.ReturnType)
                {
                case XPathResultType.String:
                case XPathResultType.NodeSet:
                case XPathResultType.Boolean:
                {
                    match = (bool)predicate.EvaluateAs(iterator, XPathResultType.Boolean);
                }
                break;

                case XPathResultType.Number:
                {
                    match = (iterator.CurrentPosition) == (double)predicate.Evaluate(iterator);
                }
                break;

                default:
                {
                    throw new NotSupportedException("TODO: " + predicate.ReturnType);
                }
                break;
                }
                if (match)
                {
                    pos++;
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 2
0
        public override bool MoveNext()
        {
            //TODO: depth first traversal - fix when doing Evaluate
            while (rhs == null || !rhs.MoveNext())
            {
                if (!lhs.MoveNext())
                {
                    return(false);
                }
                rhs = (XPathBaseIterator)expr.Evaluate(lhs);
            }

            pos++;
            // We have already done an rhs.MoveNext()
            return(true);
        }
Exemplo n.º 3
0
        public override bool MoveNext()
        {
            // TODO: investigate removing these variables
            bool movedRight = false;
            bool movedLeft  = false;

            if (!moveLeft && !moveRight)
            {
                return(false);
            }

            if (moveLeft)
            {
                movedLeft = left.MoveNext();
            }
            if (moveRight)
            {
                movedRight = right.MoveNext();
            }

            if (moveLeft && !movedLeft && moveRight && !movedRight)
            {
                return(false);
            }

            if (moveLeft && !movedLeft)
            {
                moveLeft = false;
                current  = right.Current.Clone();
                pos++;
                return(true);
            }

            if (moveRight && !movedRight)
            {
                /* from next time, don't move right */
                moveRight = false;
                current   = left.Current.Clone();
                pos++;
                return(true);
            }

            // both moves were successful or we had leftover nodes from
            // one side now we need to chose which side to output first

            XmlNodeOrder order = left.Current.ComparePosition(right.Current);

            switch (order)
            {
            case XmlNodeOrder.Same:
            {
                moveRight = moveLeft = true;
                current   = left.Current.Clone();
                pos++;
                return(true);
            }
            break;

            case XmlNodeOrder.Before:
            case XmlNodeOrder.Unknown:
            {
                moveLeft  = true;
                moveRight = false;
                current   = left.Current.Clone();
                pos++;
                return(true);
            }
            break;

            case XmlNodeOrder.After:
            {
                moveLeft  = false;
                moveRight = true;
                current   = right.Current.Clone();
                pos++;
                return(true);
            }
            break;

            default:
            {
                throw new XPathException("Could understand node relationship : " + order.ToString(), null);
            }
            break;
            }

            return(false);
        }