Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / Xml / System / Xml / XPath / Internal / precedingquery.cs / 1 / precedingquery.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace MS.Internal.Xml.XPath {
using System;
using System.Xml;
using System.Xml.XPath;
using System.Diagnostics;
using System.Collections.Generic;
using StackNav = ClonableStack;
// Algorithm:
// Input assumption: qyInput is in DocOrder.
// Preceding of a sequence of nodes will be preceding of last node in DocOrder in that sequence.
// Because qyInput is in DO last input is last node in DO. -- "last"
// If last node is attribute or namespace move last to it element.
// Push this last node and all its ancestors into the ancestorStk. The root node will be the top-most element on the stack.
// Create descendent iterator from the root. -- "workIterator"
// Advancing workIterator we meet all nodes from the ancestorStk in stack order. Nodes in ancestorStk do no belong to the
// the 'preceding' axis and must be ignored.
// Last node in ancestorStk is a centinel node; when we pop it from ancestorStk, we should stop iterations.
internal sealed class PrecedingQuery : BaseAxisQuery {
private XPathNodeIterator workIterator;
private StackNav ancestorStk;
public PrecedingQuery(Query qyInput, string name, string prefix, XPathNodeType typeTest) : base(qyInput, name, prefix, typeTest) {
ancestorStk = new StackNav();
}
private PrecedingQuery(PrecedingQuery other) : base(other) {
this.workIterator = Clone(other.workIterator);
this.ancestorStk = other.ancestorStk.Clone();
}
public override void Reset() {
workIterator = null;
ancestorStk.Clear();
base.Reset();
}
public override XPathNavigator Advance() {
if (workIterator == null) {
XPathNavigator last; {
XPathNavigator input = qyInput.Advance();
if (input == null) {
return null;
}
last = input.Clone();
do {
last.MoveTo(input);
} while ((input = qyInput.Advance()) != null);
if (last.NodeType == XPathNodeType.Attribute || last.NodeType == XPathNodeType.Namespace) {
last.MoveToParent();
}
}
// Fill ancestorStk :
do {
ancestorStk.Push(last.Clone());
} while (last.MoveToParent());
// Create workIterator :
// last.MoveToRoot(); We are on root already
workIterator = last.SelectDescendants(XPathNodeType.All, true);
}
while (workIterator.MoveNext()) {
currentNode = workIterator.Current;
if (currentNode.IsSamePosition(ancestorStk.Peek())) {
ancestorStk.Pop();
if (ancestorStk.Count == 0) {
currentNode = null;
workIterator = null;
Debug.Assert(qyInput.Advance() == null, "we read all qyInput.Advance() already");
return null;
}
continue;
}
if (matches(currentNode)) {
position++;
return currentNode;
}
}
Debug.Fail("Algorithm error: we missed the centinel node");
return null;
}
public override XPathNodeIterator Clone() { return new PrecedingQuery(this); }
public override QueryProps Properties { get { return base.Properties | QueryProps.Reverse; } }
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AsymmetricSignatureDeformatter.cs
- AutomationPatternInfo.cs
- MimeReflector.cs
- RecommendedAsConfigurableAttribute.cs
- IdentityHolder.cs
- HelpInfo.cs
- FileUpload.cs
- MultiDataTrigger.cs
- EpmAttributeNameBuilder.cs
- RenderData.cs
- SafeReadContext.cs
- TimeoutValidationAttribute.cs
- TableLayoutCellPaintEventArgs.cs
- StringResourceManager.cs
- SingleConverter.cs
- DispatchWrapper.cs
- GenericWebPart.cs
- ValueUnavailableException.cs
- CustomAssemblyResolver.cs
- AssemblyName.cs
- GridLength.cs
- ConfigurationStrings.cs
- HttpCookiesSection.cs
- SHA256Managed.cs
- ReadWriteObjectLock.cs
- ConnectionInterfaceCollection.cs
- TypeInitializationException.cs
- PageSettings.cs
- DataGridViewTextBoxCell.cs
- RenamedEventArgs.cs
- WebPartManagerInternals.cs
- XPathDocumentIterator.cs
- QuadraticBezierSegment.cs
- SessionPageStatePersister.cs
- CounterSampleCalculator.cs
- DataPagerFieldCollection.cs
- SystemIcmpV4Statistics.cs
- LogWriteRestartAreaState.cs
- SqlDataSourceSelectingEventArgs.cs
- CharAnimationUsingKeyFrames.cs
- ConnectionInterfaceCollection.cs
- Scene3D.cs
- DesignerAttributeInfo.cs
- ResourceDictionary.cs
- ResourceDisplayNameAttribute.cs
- errorpatternmatcher.cs
- RefExpr.cs
- RedirectionProxy.cs
- DbMetaDataFactory.cs
- WindowsRegion.cs
- CompilerError.cs
- CheckBoxList.cs
- SecurityDescriptor.cs
- ExtenderControl.cs
- UserValidatedEventArgs.cs
- XmlSchemaComplexType.cs
- SID.cs
- odbcmetadatacollectionnames.cs
- AjaxFrameworkAssemblyAttribute.cs
- AdornerHitTestResult.cs
- MessageSecurityProtocol.cs
- TextPointer.cs
- SignedXmlDebugLog.cs
- WindowsListViewGroupSubsetLink.cs
- SourceLineInfo.cs
- TimeSpanStorage.cs
- UntypedNullExpression.cs
- _StreamFramer.cs
- FontStretches.cs
- MarshalByRefObject.cs
- XmlSequenceWriter.cs
- ConstructorArgumentAttribute.cs
- WinFormsComponentEditor.cs
- GridViewCommandEventArgs.cs
- HttpErrorTraceRecord.cs
- datacache.cs
- ComponentRenameEvent.cs
- ActiveDocumentEvent.cs
- WorkflowApplicationCompletedException.cs
- MediaPlayer.cs
- PrincipalPermission.cs
- PolyBezierSegment.cs
- QuotedPairReader.cs
- SqlColumnizer.cs
- ErasingStroke.cs
- ExportFileRequest.cs
- Pen.cs
- BaseTemplateBuildProvider.cs
- LicenseException.cs
- PolyBezierSegment.cs
- BatchParser.cs
- Object.cs
- InputReportEventArgs.cs
- TimeStampChecker.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- ByteFacetDescriptionElement.cs
- LiteralTextContainerControlBuilder.cs
- InputLanguageProfileNotifySink.cs
- Header.cs
- SqlTrackingQuery.cs