Code:
/ 4.0 / 4.0 / 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.
//------------------------------------------------------------------------------
//
// 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
- HttpModulesSection.cs
- HtmlDocument.cs
- ProjectionPruner.cs
- ConfigDefinitionUpdates.cs
- MexTcpBindingCollectionElement.cs
- CodeVariableReferenceExpression.cs
- EntityModelSchemaGenerator.cs
- DataGridrowEditEndingEventArgs.cs
- ToolStripContentPanelDesigner.cs
- InputScopeConverter.cs
- ClientConfigurationSystem.cs
- ApplicationException.cs
- TextDecorationCollection.cs
- SocketStream.cs
- Geometry3D.cs
- WhitespaceRule.cs
- ExceptionAggregator.cs
- SQLSingleStorage.cs
- TextAction.cs
- DataKeyCollection.cs
- VisualTreeHelper.cs
- StringValueSerializer.cs
- PreviewControlDesigner.cs
- Reference.cs
- XmlHelper.cs
- HttpRequest.cs
- RTLAwareMessageBox.cs
- DecimalAnimationUsingKeyFrames.cs
- RoutedEventValueSerializer.cs
- InfocardChannelParameter.cs
- OleDbConnectionInternal.cs
- Tokenizer.cs
- SystemSounds.cs
- TextComposition.cs
- ImportStoreException.cs
- SchemaLookupTable.cs
- ArrayWithOffset.cs
- MessageBox.cs
- JsonSerializer.cs
- VisualStates.cs
- Int64.cs
- SpellerHighlightLayer.cs
- CommonObjectSecurity.cs
- HotSpotCollectionEditor.cs
- ZipIOExtraFieldElement.cs
- Vector3DIndependentAnimationStorage.cs
- TextServicesHost.cs
- Invariant.cs
- ButtonFlatAdapter.cs
- XmlExtensionFunction.cs
- EventKeyword.cs
- TagMapInfo.cs
- AdRotator.cs
- RunInstallerAttribute.cs
- KeySpline.cs
- NavigationProperty.cs
- TcpConnectionPoolSettings.cs
- PipelineModuleStepContainer.cs
- EmissiveMaterial.cs
- EdmPropertyAttribute.cs
- FileDialog.cs
- Pair.cs
- IndexedSelectQueryOperator.cs
- PasswordDeriveBytes.cs
- OleTxTransaction.cs
- Calendar.cs
- NativeCompoundFileAPIs.cs
- DataColumnChangeEvent.cs
- RedirectionProxy.cs
- SqlConnectionStringBuilder.cs
- HttpListenerElement.cs
- TypeDescriptionProviderAttribute.cs
- Monitor.cs
- FixedDocumentPaginator.cs
- TypographyProperties.cs
- ProgressBar.cs
- RichTextBox.cs
- CalendarSelectionChangedEventArgs.cs
- DrawingServices.cs
- DataBoundControl.cs
- DBCSCodePageEncoding.cs
- ConnectionManagementElement.cs
- Directory.cs
- ReaderWriterLock.cs
- Version.cs
- CallbackValidatorAttribute.cs
- DataTableReader.cs
- JavaScriptSerializer.cs
- COM2EnumConverter.cs
- DocumentApplicationJournalEntry.cs
- configsystem.cs
- CqlParser.cs
- FormatSettings.cs
- XPathScanner.cs
- DataRelation.cs
- ConstructorExpr.cs
- StronglyTypedResourceBuilder.cs
- TypeUsageBuilder.cs
- _OSSOCK.cs
- TableLayoutStyleCollection.cs