Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / XPath / Internal / DescendantOverDescendantQuery.cs / 1305376 / DescendantOverDescendantQuery.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;
// DescendantOverDescendantQuery: for each input it looks for the topmost descendents that matches to ns:name
// This is posible when query which has this query as its input (child query) is descendent as well.
// Work of this query doesn't depend on DOD of its input.
// It doesn't garate DOD of the output even when input is DOD.
internal sealed class DescendantOverDescendantQuery : DescendantBaseQuery {
private int level = 0;
public DescendantOverDescendantQuery(Query qyParent, bool matchSelf, string name, string prefix, XPathNodeType typeTest, bool abbrAxis) :
base(qyParent, name, prefix, typeTest, matchSelf, abbrAxis) {}
private DescendantOverDescendantQuery(DescendantOverDescendantQuery other) : base(other) {
this.level = other.level;
}
public override void Reset() {
level = 0;
base.Reset();
}
public override XPathNavigator Advance() {
while (true) {
if (level == 0) {
currentNode = qyInput.Advance();
position = 0;
if (currentNode == null) {
return null;
}
if (matchSelf && matches(currentNode)) {
position = 1;
return currentNode;
}
currentNode = currentNode.Clone();
if (! MoveToFirstChild()) {
continue;
}
} else {
if (!MoveUpUntillNext()) {
continue;
}
}
do {
if (matches(currentNode)) {
position++;
return currentNode;
}
} while (MoveToFirstChild());
}
}
private bool MoveToFirstChild() {
if (currentNode.MoveToFirstChild()) {
level++;
return true;
}
return false;
}
private bool MoveUpUntillNext() { // move up untill we can move next
while (! currentNode.MoveToNext()) {
-- level;
if (level == 0) {
return false;
}
bool result = currentNode.MoveToParent();
Debug.Assert(result, "Algorithm error, We always should be able to move up if level > 0");
}
return true;
}
public override XPathNodeIterator Clone() { return new DescendantOverDescendantQuery(this); }
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FontStretchConverter.cs
- ListViewTableRow.cs
- httpstaticobjectscollection.cs
- OrderedDictionaryStateHelper.cs
- CustomErrorsSectionWrapper.cs
- TreeNodeEventArgs.cs
- IntegrationExceptionEventArgs.cs
- AnonymousIdentificationModule.cs
- DesignerImageAdapter.cs
- ComponentGuaranteesAttribute.cs
- DbDataAdapter.cs
- GeneralTransform3DGroup.cs
- TableDesigner.cs
- UnknownBitmapEncoder.cs
- SmiContextFactory.cs
- MoveSizeWinEventHandler.cs
- SqlClientPermission.cs
- WindowsFormsHost.cs
- AttributeEmitter.cs
- Style.cs
- InlineCollection.cs
- WebServiceClientProxyGenerator.cs
- ImageDrawing.cs
- PassportIdentity.cs
- ImageAttributes.cs
- LinqDataSource.cs
- StylusPointDescription.cs
- SqlAliaser.cs
- SettingsPropertyCollection.cs
- GridViewColumn.cs
- MissingManifestResourceException.cs
- HttpWebRequest.cs
- XmlSchemaNotation.cs
- XmlAtomicValue.cs
- WebPartDisplayModeCancelEventArgs.cs
- HMACSHA256.cs
- Transform3DGroup.cs
- DataObjectFieldAttribute.cs
- MulticastNotSupportedException.cs
- PanelStyle.cs
- ToolStripItemClickedEventArgs.cs
- SoapServerMethod.cs
- PathSegmentCollection.cs
- DataServiceException.cs
- OracleInternalConnection.cs
- xmlglyphRunInfo.cs
- GacUtil.cs
- RowToParametersTransformer.cs
- WriteTimeStream.cs
- securestring.cs
- SimpleWorkerRequest.cs
- FixedMaxHeap.cs
- ListBoxItem.cs
- HandledEventArgs.cs
- HostExecutionContextManager.cs
- NavigationPropertyEmitter.cs
- AccessorTable.cs
- WebPartVerbsEventArgs.cs
- ControlValuePropertyAttribute.cs
- MenuItemBindingCollection.cs
- XsdValidatingReader.cs
- ColumnHeaderConverter.cs
- DictionaryKeyPropertyAttribute.cs
- ProjectionAnalyzer.cs
- DataGridViewDataConnection.cs
- _BasicClient.cs
- AngleUtil.cs
- TaiwanLunisolarCalendar.cs
- GPPOINTF.cs
- EFTableProvider.cs
- DataGridColumnHeaderCollection.cs
- EntityClassGenerator.cs
- TripleDESCryptoServiceProvider.cs
- GPRECT.cs
- MetafileHeaderWmf.cs
- CompressStream.cs
- SizeAnimationUsingKeyFrames.cs
- NavigatingCancelEventArgs.cs
- MutableAssemblyCacheEntry.cs
- TakeQueryOptionExpression.cs
- HttpRuntime.cs
- ChannelBase.cs
- RegexMatchCollection.cs
- QueuePropertyVariants.cs
- RolePrincipal.cs
- VirtualizingStackPanel.cs
- DataBoundControl.cs
- SelectionEditingBehavior.cs
- WebPartTracker.cs
- UriTemplateClientFormatter.cs
- DataExpression.cs
- DoubleCollectionValueSerializer.cs
- CircleHotSpot.cs
- SignatureDescription.cs
- InputProcessorProfiles.cs
- LedgerEntry.cs
- StrokeNodeEnumerator.cs
- XmlBinaryReader.cs
- WebPartEditVerb.cs
- RichTextBoxConstants.cs