Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / XPath / Internal / CacheChildrenQuery.cs / 1305376 / 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
- Polygon.cs
- XmlDocumentSerializer.cs
- AudioFormatConverter.cs
- ModifyActivitiesPropertyDescriptor.cs
- DescendentsWalkerBase.cs
- CorrelationToken.cs
- XmlObjectSerializerWriteContextComplexJson.cs
- LineUtil.cs
- ModulesEntry.cs
- DataChangedEventManager.cs
- CloseSequence.cs
- MarkupExtensionParser.cs
- WebContext.cs
- XpsImageSerializationService.cs
- Focus.cs
- CompilationAssemblyInstallComponent.cs
- PackageRelationship.cs
- TabPage.cs
- OracleMonthSpan.cs
- MatrixCamera.cs
- PersistencePipeline.cs
- WrapPanel.cs
- SourceElementsCollection.cs
- DbConnectionPoolGroup.cs
- httpapplicationstate.cs
- SQlBooleanStorage.cs
- DataContractSerializer.cs
- ServiceModelTimeSpanValidator.cs
- SafeMarshalContext.cs
- ToolStripSystemRenderer.cs
- TemplateBindingExpressionConverter.cs
- ScriptMethodAttribute.cs
- AuthenticationServiceManager.cs
- TraceEventCache.cs
- ControlIdConverter.cs
- DataGridViewCellStyleContentChangedEventArgs.cs
- NetworkCredential.cs
- ColumnProvider.cs
- EntityCommandDefinition.cs
- IssuanceTokenProviderBase.cs
- HwndStylusInputProvider.cs
- PageVisual.cs
- ListControlConvertEventArgs.cs
- HtmlAnchor.cs
- WindowsListBox.cs
- TransformConverter.cs
- SqlPersonalizationProvider.cs
- NameObjectCollectionBase.cs
- XmlSchemaAll.cs
- RegexCharClass.cs
- Sql8ExpressionRewriter.cs
- StringUtil.cs
- ThreadStateException.cs
- EventMap.cs
- ByteStream.cs
- XmlnsCompatibleWithAttribute.cs
- MulticastDelegate.cs
- ProjectionCamera.cs
- XmlLanguageConverter.cs
- DesignerObjectListAdapter.cs
- DataMemberAttribute.cs
- ServiceOperationInfoTypeConverter.cs
- DataGridViewTextBoxCell.cs
- BitmapEffectState.cs
- Column.cs
- LoadGrammarCompletedEventArgs.cs
- TreeView.cs
- Win32Native.cs
- ExpressionVisitorHelpers.cs
- MimeTypeAttribute.cs
- HostingPreferredMapPath.cs
- CustomErrorsSection.cs
- InputScope.cs
- ReadOnlyCollection.cs
- SeparatorAutomationPeer.cs
- XmlUtf8RawTextWriter.cs
- validation.cs
- DataGridViewTextBoxEditingControl.cs
- StrokeCollection2.cs
- CustomPopupPlacement.cs
- MappedMetaModel.cs
- DockingAttribute.cs
- DataGridComponentEditor.cs
- PropertyConverter.cs
- MatrixConverter.cs
- PaginationProgressEventArgs.cs
- CommentAction.cs
- Point3DAnimationUsingKeyFrames.cs
- _NetRes.cs
- ScalarRestriction.cs
- ExpressionWriter.cs
- SrgsDocument.cs
- AxDesigner.cs
- WaitHandleCannotBeOpenedException.cs
- ComPersistableTypeElement.cs
- RenamedEventArgs.cs
- SoapMessage.cs
- DefaultPropertyAttribute.cs
- ResourceAssociationTypeEnd.cs
- Main.cs