Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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.
//
// [....]
//-----------------------------------------------------------------------------
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
- EntitySqlException.cs
- ResXResourceWriter.cs
- SQLStringStorage.cs
- CodeObject.cs
- DataGridViewComboBoxColumnDesigner.cs
- XmlSchemaImport.cs
- DataGridColumnDropSeparator.cs
- OutputCacheModule.cs
- StylesEditorDialog.cs
- XmlDownloadManager.cs
- AppDomainProtocolHandler.cs
- Int32.cs
- DefaultHttpHandler.cs
- MissingSatelliteAssemblyException.cs
- StrokeNodeOperations.cs
- TransactionScope.cs
- TransformerInfo.cs
- BindingsCollection.cs
- TextBoxLine.cs
- cryptoapiTransform.cs
- XamlToRtfWriter.cs
- ClaimSet.cs
- FragmentQuery.cs
- tibetanshape.cs
- ResourceDescriptionAttribute.cs
- UserControl.cs
- KeyValueConfigurationElement.cs
- SaveFileDialog.cs
- XPathEmptyIterator.cs
- PointConverter.cs
- HitTestParameters.cs
- DataTrigger.cs
- OrderToken.cs
- ZipIOFileItemStream.cs
- DataGridViewLinkCell.cs
- SchemaType.cs
- DataSysAttribute.cs
- MetafileHeader.cs
- SignatureToken.cs
- WizardPanel.cs
- _NetRes.cs
- HexParser.cs
- ReliableChannelListener.cs
- RecipientInfo.cs
- ComboBox.cs
- ConstrainedDataObject.cs
- DataGridViewRow.cs
- PrinterResolution.cs
- ExeContext.cs
- RegexParser.cs
- StaticTextPointer.cs
- DynamicHyperLink.cs
- GeometryGroup.cs
- CodeTypeParameterCollection.cs
- ProgressBar.cs
- WorkflowQueue.cs
- DetailsView.cs
- RangeBase.cs
- JsonServiceDocumentSerializer.cs
- AccessDataSource.cs
- Transform3DCollection.cs
- SerTrace.cs
- StylusTip.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- SapiAttributeParser.cs
- OdbcInfoMessageEvent.cs
- querybuilder.cs
- ListViewItemEventArgs.cs
- ProcessMessagesAsyncResult.cs
- FolderLevelBuildProviderCollection.cs
- ProfessionalColorTable.cs
- XmlImplementation.cs
- SharedConnectionInfo.cs
- UserPreferenceChangedEventArgs.cs
- PackUriHelper.cs
- WsatAdminException.cs
- DebugManager.cs
- HttpModuleCollection.cs
- TypeUtils.cs
- AttachedAnnotation.cs
- UInt64Converter.cs
- ComplexLine.cs
- MenuItemStyleCollection.cs
- ObjectStateFormatter.cs
- Int32RectValueSerializer.cs
- WorkflowItemsPresenter.cs
- Int16AnimationUsingKeyFrames.cs
- WindowsComboBox.cs
- HtmlInputButton.cs
- TextParagraph.cs
- PreProcessInputEventArgs.cs
- AccessText.cs
- PenCursorManager.cs
- ParseChildrenAsPropertiesAttribute.cs
- ButtonColumn.cs
- ScaleTransform.cs
- StylusPlugInCollection.cs
- DataKeyCollection.cs
- FormsAuthenticationUser.cs
- ConnectionPointGlyph.cs