Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Xml / System / Xml / XPath / Internal / DescendantOverDescendantQuery.cs / 1 / 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.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SmtpAuthenticationManager.cs
- State.cs
- ArrayExtension.cs
- SineEase.cs
- QueryResponse.cs
- WorkflowMessageEventHandler.cs
- XmlSchemaSimpleType.cs
- NetPeerTcpBindingElement.cs
- HttpAsyncResult.cs
- NamedPipeProcessProtocolHandler.cs
- ResourceExpressionEditorSheet.cs
- DiscardableAttribute.cs
- WrappedIUnknown.cs
- EnumerableWrapperWeakToStrong.cs
- XPathDocumentNavigator.cs
- DataPagerFieldCommandEventArgs.cs
- XmlCharCheckingReader.cs
- RowBinding.cs
- AppModelKnownContentFactory.cs
- FileNotFoundException.cs
- PresentationTraceSources.cs
- TagPrefixInfo.cs
- DataGridViewCellStyleChangedEventArgs.cs
- MimeTextImporter.cs
- QilInvokeEarlyBound.cs
- DataBindingCollectionEditor.cs
- XmlBoundElement.cs
- RpcCryptoRequest.cs
- DataGridPagerStyle.cs
- PropertyDescriptorCollection.cs
- SQLBytes.cs
- Psha1DerivedKeyGenerator.cs
- DataSet.cs
- CertificateReferenceElement.cs
- XmlObjectSerializerWriteContext.cs
- DataError.cs
- SessionEndingCancelEventArgs.cs
- HtmlTableCellCollection.cs
- HashHelper.cs
- DBDataPermissionAttribute.cs
- BindingsCollection.cs
- StateMachine.cs
- EntityDataSourceState.cs
- ProfileGroupSettingsCollection.cs
- DesignerCalendarAdapter.cs
- TrustSection.cs
- RepeatButtonAutomationPeer.cs
- InputChannelBinder.cs
- SQLMembershipProvider.cs
- ProtocolsConfiguration.cs
- GradientStop.cs
- ClientSettingsSection.cs
- FacetValueContainer.cs
- InternalCache.cs
- Imaging.cs
- ExecutorLocksHeldException.cs
- CompositeControlDesigner.cs
- FrameworkContentElement.cs
- TypeResolvingOptions.cs
- SapiGrammar.cs
- Misc.cs
- ListControlConvertEventArgs.cs
- RotationValidation.cs
- StringTraceRecord.cs
- BooleanSwitch.cs
- TextEditorTables.cs
- BuildProvider.cs
- ICspAsymmetricAlgorithm.cs
- ExpressionTextBoxAutomationPeer.cs
- XmlDocumentFragment.cs
- ProcessModelInfo.cs
- SystemWebSectionGroup.cs
- FacetDescription.cs
- SQLBinary.cs
- DataReaderContainer.cs
- Matrix3DConverter.cs
- AppearanceEditorPart.cs
- SqlMethodCallConverter.cs
- MultiBinding.cs
- ExpressionConverter.cs
- control.ime.cs
- TypeInitializationException.cs
- XmlAnyElementAttributes.cs
- DoubleAverageAggregationOperator.cs
- XsdDataContractExporter.cs
- ImplicitInputBrush.cs
- OciEnlistContext.cs
- UriScheme.cs
- RuntimeResourceSet.cs
- HTMLTagNameToTypeMapper.cs
- DataGridViewCellStyle.cs
- MostlySingletonList.cs
- datacache.cs
- HighlightComponent.cs
- HttpContext.cs
- MenuItemBinding.cs
- VisualProxy.cs
- TimeZone.cs
- ByteConverter.cs
- XappLauncher.cs