Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / Xml / System / Xml / XPath / Internal / CacheChildrenQuery.cs / 1 / CacheChildrenQuery.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.Globalization;
using System.Collections.Generic;
using StackInt = ClonableStack;
using StackNav = ClonableStack;
// This class implements Children axis on Ancestor & Descendant imputs. (as well as id(), preciding, following)
// The problem here is that is descenant::*/child::* and ancestor::*/child::* can produce duplicates nodes
// The algorithm havily uses the fact that in our implementation of both AncestorQuery and DecsndantQuery return nodes in document order.
// As result first child is always before or equal of next input.
// So we don't need to call DecideNextNode() when needInput == true && stack is empty.
internal sealed class CacheChildrenQuery : ChildrenQuery {
XPathNavigator nextInput = null;
StackNav elementStk;
StackInt positionStk;
bool needInput;
#if DEBUG
XPathNavigator lastNode = null;
#endif
public CacheChildrenQuery(Query qyInput, string name, string prefix, XPathNodeType type) : base(qyInput, name, prefix, type) {
this.elementStk = new StackNav();
this.positionStk = new StackInt();
this.needInput = true;
}
private CacheChildrenQuery(CacheChildrenQuery other) : base(other) {
this.nextInput = Clone(other.nextInput);
this.elementStk = other.elementStk.Clone();
this.positionStk = other.positionStk.Clone();
this.needInput = other.needInput;
#if DEBUG
this.lastNode = Clone(other.lastNode);
#endif
}
public override void Reset() {
nextInput = null;
elementStk.Clear();
positionStk.Clear();
needInput = true;
base.Reset();
#if DEBUG
lastNode = null;
#endif
}
public override XPathNavigator Advance() {
do {
if (needInput) {
if (elementStk.Count == 0) {
currentNode = GetNextInput();
if (currentNode == null) {
return null;
}
if (!currentNode.MoveToFirstChild()) {
continue;
}
position = 0;
} else {
currentNode = elementStk .Pop();
position = positionStk.Pop();
if (!DecideNextNode()) {
continue;
}
}
needInput = false;
} else {
if (!currentNode.MoveToNext() || !DecideNextNode()) {
needInput = true;
continue;
}
}
#if DEBUG
if (lastNode != null) {
if (currentNode.GetType().ToString() == "Microsoft.VisualStudio.Modeling.StoreNavigator") {
XmlNodeOrder order = CompareNodes(lastNode, currentNode);
Debug.Assert(order == XmlNodeOrder.Before, "Algorith error. Nodes expected to be DocOrderDistinct");
}
}
lastNode = currentNode.Clone();
#endif
if (matches(currentNode)) {
position++;
return currentNode;
}
} while (true);
} // Advance
private bool DecideNextNode() {
nextInput = GetNextInput();
if (nextInput != null) {
if (CompareNodes(currentNode, nextInput) == XmlNodeOrder.After) {
elementStk .Push(currentNode);
positionStk.Push(position);
currentNode = nextInput;
nextInput = null;
if (!currentNode.MoveToFirstChild()) {
return false;
}
position = 0;
}
}
return true;
}
private XPathNavigator GetNextInput() {
XPathNavigator result;
if (nextInput != null) {
result = nextInput;
nextInput = null;
} else {
result = qyInput.Advance();
if (result != null) {
result = result.Clone();
}
}
return result;
}
public override XPathNodeIterator Clone() { return new CacheChildrenQuery(this); }
} // Children Query}
}
// 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;
using System.Globalization;
using System.Collections.Generic;
using StackInt = ClonableStack;
using StackNav = ClonableStack;
// This class implements Children axis on Ancestor & Descendant imputs. (as well as id(), preciding, following)
// The problem here is that is descenant::*/child::* and ancestor::*/child::* can produce duplicates nodes
// The algorithm havily uses the fact that in our implementation of both AncestorQuery and DecsndantQuery return nodes in document order.
// As result first child is always before or equal of next input.
// So we don't need to call DecideNextNode() when needInput == true && stack is empty.
internal sealed class CacheChildrenQuery : ChildrenQuery {
XPathNavigator nextInput = null;
StackNav elementStk;
StackInt positionStk;
bool needInput;
#if DEBUG
XPathNavigator lastNode = null;
#endif
public CacheChildrenQuery(Query qyInput, string name, string prefix, XPathNodeType type) : base(qyInput, name, prefix, type) {
this.elementStk = new StackNav();
this.positionStk = new StackInt();
this.needInput = true;
}
private CacheChildrenQuery(CacheChildrenQuery other) : base(other) {
this.nextInput = Clone(other.nextInput);
this.elementStk = other.elementStk.Clone();
this.positionStk = other.positionStk.Clone();
this.needInput = other.needInput;
#if DEBUG
this.lastNode = Clone(other.lastNode);
#endif
}
public override void Reset() {
nextInput = null;
elementStk.Clear();
positionStk.Clear();
needInput = true;
base.Reset();
#if DEBUG
lastNode = null;
#endif
}
public override XPathNavigator Advance() {
do {
if (needInput) {
if (elementStk.Count == 0) {
currentNode = GetNextInput();
if (currentNode == null) {
return null;
}
if (!currentNode.MoveToFirstChild()) {
continue;
}
position = 0;
} else {
currentNode = elementStk .Pop();
position = positionStk.Pop();
if (!DecideNextNode()) {
continue;
}
}
needInput = false;
} else {
if (!currentNode.MoveToNext() || !DecideNextNode()) {
needInput = true;
continue;
}
}
#if DEBUG
if (lastNode != null) {
if (currentNode.GetType().ToString() == "Microsoft.VisualStudio.Modeling.StoreNavigator") {
XmlNodeOrder order = CompareNodes(lastNode, currentNode);
Debug.Assert(order == XmlNodeOrder.Before, "Algorith error. Nodes expected to be DocOrderDistinct");
}
}
lastNode = currentNode.Clone();
#endif
if (matches(currentNode)) {
position++;
return currentNode;
}
} while (true);
} // Advance
private bool DecideNextNode() {
nextInput = GetNextInput();
if (nextInput != null) {
if (CompareNodes(currentNode, nextInput) == XmlNodeOrder.After) {
elementStk .Push(currentNode);
positionStk.Push(position);
currentNode = nextInput;
nextInput = null;
if (!currentNode.MoveToFirstChild()) {
return false;
}
position = 0;
}
}
return true;
}
private XPathNavigator GetNextInput() {
XPathNavigator result;
if (nextInput != null) {
result = nextInput;
nextInput = null;
} else {
result = qyInput.Advance();
if (result != null) {
result = result.Clone();
}
}
return result;
}
public override XPathNodeIterator Clone() { return new CacheChildrenQuery(this); }
} // Children Query}
}
// 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
- ApplicationHost.cs
- PageOrientation.cs
- DataGridViewColumn.cs
- PathFigureCollection.cs
- ControlParameter.cs
- DBConcurrencyException.cs
- Misc.cs
- CodePrimitiveExpression.cs
- HashUtility.cs
- XmlDocumentSurrogate.cs
- FieldTemplateFactory.cs
- ProgressiveCrcCalculatingStream.cs
- TypeLibConverter.cs
- MimeTextImporter.cs
- QuaternionConverter.cs
- FormViewRow.cs
- QilTypeChecker.cs
- Int16KeyFrameCollection.cs
- Size3DConverter.cs
- MouseButton.cs
- InkCollectionBehavior.cs
- SQLBytesStorage.cs
- RenderData.cs
- BinaryWriter.cs
- BuildProviderUtils.cs
- BitmapDownload.cs
- WebRequestModuleElementCollection.cs
- IResourceProvider.cs
- PersistNameAttribute.cs
- PipelineModuleStepContainer.cs
- CalendarButton.cs
- Choices.cs
- X509Utils.cs
- SRGSCompiler.cs
- Oci.cs
- StatusInfoItem.cs
- DataPagerCommandEventArgs.cs
- SoapServerMessage.cs
- TriggerCollection.cs
- EventManager.cs
- PartialTrustVisibleAssembly.cs
- CommandEventArgs.cs
- CodeSubDirectoriesCollection.cs
- Viewport2DVisual3D.cs
- RsaKeyIdentifierClause.cs
- SymmetricKey.cs
- DataPagerFieldCommandEventArgs.cs
- Quaternion.cs
- CachedPathData.cs
- Brushes.cs
- ComContractElement.cs
- DiagnosticTraceSchemas.cs
- ToolStripSplitButton.cs
- Package.cs
- MatrixTransform.cs
- GregorianCalendar.cs
- FormView.cs
- MultidimensionalArrayItemReference.cs
- dataobject.cs
- DispatchWrapper.cs
- RadialGradientBrush.cs
- HwndMouseInputProvider.cs
- DrawingBrush.cs
- ScriptManagerProxy.cs
- TemplateNameScope.cs
- CheckBox.cs
- EntitySetBaseCollection.cs
- Converter.cs
- TreeNodeEventArgs.cs
- DesignerWithHeader.cs
- CLSCompliantAttribute.cs
- RTLAwareMessageBox.cs
- FlowDocumentScrollViewer.cs
- BasicHttpMessageCredentialType.cs
- SimpleRecyclingCache.cs
- DataSourceView.cs
- CodeArrayCreateExpression.cs
- TranslateTransform3D.cs
- GetPageCompletedEventArgs.cs
- ObjectNavigationPropertyMapping.cs
- SqlProfileProvider.cs
- FileInfo.cs
- GridViewColumnHeaderAutomationPeer.cs
- MinMaxParagraphWidth.cs
- InvalidFilterCriteriaException.cs
- loginstatus.cs
- TreeView.cs
- Vector3DAnimation.cs
- ClrProviderManifest.cs
- VectorKeyFrameCollection.cs
- TextDecoration.cs
- Visual.cs
- CodeDefaultValueExpression.cs
- FontNameConverter.cs
- ControlCachePolicy.cs
- ConvertEvent.cs
- ScaleTransform.cs
- ArrayTypeMismatchException.cs
- AppDomainGrammarProxy.cs
- BindableAttribute.cs