Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / XPath / Internal / precedingsibling.cs / 1305376 / precedingsibling.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.Collections.Generic; // This class can be rewritten much more efficient. // Algorithm could be like one for FollowingSibling: // - Build InputArrays: pares (first, sentinel) // -- Cash all input nodes as sentinel // -- Add firts node of its parent for each input node. // -- Sort these pares by first nodes. // - Advance algorithm will look like: // -- For each row in InputArays we will output first node + all its following nodes which are < sentinel // -- Before outputing each node in row #I we will check that it is < first node in row #I+1 // --- if true we actualy output it // --- if false, we hold with row #I and apply this algorith starting for row #I+1 // --- when we done with #I+1 we continue with row #I internal class PreSiblingQuery : CacheAxisQuery { public PreSiblingQuery(Query qyInput, string name, string prefix, XPathNodeType typeTest) : base (qyInput, name, prefix, typeTest) {} protected PreSiblingQuery(PreSiblingQuery other) : base(other) {} private bool NotVisited(XPathNavigator nav, ListparentStk){ XPathNavigator nav1 = nav.Clone(); nav1.MoveToParent(); for (int i = 0; i < parentStk.Count; i++) { if (nav1.IsSamePosition(parentStk[i])) { return false; } } parentStk.Add(nav1); return true; } public override object Evaluate(XPathNodeIterator context) { base.Evaluate(context); // Fill up base.outputBuffer List parentStk = new List (); Stack inputStk = new Stack (); while ((currentNode = qyInput.Advance()) != null) { inputStk.Push(currentNode.Clone()); } while (inputStk.Count != 0) { XPathNavigator input = inputStk.Pop(); if (input.NodeType == XPathNodeType.Attribute || input.NodeType == XPathNodeType.Namespace) { continue; } if (NotVisited(input, parentStk)) { XPathNavigator prev = input.Clone(); if (prev.MoveToParent()) { bool test = prev.MoveToFirstChild(); Debug.Assert(test, "We just moved to parent, how we can not have first child?"); while (!prev.IsSamePosition(input)) { if (matches(prev)) { Insert(outputBuffer, prev); } if (!prev.MoveToNext()) { Debug.Fail("We managed to miss sentinel node (input)"); break; } } } } } return this; } public override XPathNodeIterator Clone() { return new PreSiblingQuery(this); } public override QueryProps Properties { get { return base.Properties | QueryProps.Reverse; } } } } // 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.Collections.Generic; // This class can be rewritten much more efficient. // Algorithm could be like one for FollowingSibling: // - Build InputArrays: pares (first, sentinel) // -- Cash all input nodes as sentinel // -- Add firts node of its parent for each input node. // -- Sort these pares by first nodes. // - Advance algorithm will look like: // -- For each row in InputArays we will output first node + all its following nodes which are < sentinel // -- Before outputing each node in row #I we will check that it is < first node in row #I+1 // --- if true we actualy output it // --- if false, we hold with row #I and apply this algorith starting for row #I+1 // --- when we done with #I+1 we continue with row #I internal class PreSiblingQuery : CacheAxisQuery { public PreSiblingQuery(Query qyInput, string name, string prefix, XPathNodeType typeTest) : base (qyInput, name, prefix, typeTest) {} protected PreSiblingQuery(PreSiblingQuery other) : base(other) {} private bool NotVisited(XPathNavigator nav, ListparentStk){ XPathNavigator nav1 = nav.Clone(); nav1.MoveToParent(); for (int i = 0; i < parentStk.Count; i++) { if (nav1.IsSamePosition(parentStk[i])) { return false; } } parentStk.Add(nav1); return true; } public override object Evaluate(XPathNodeIterator context) { base.Evaluate(context); // Fill up base.outputBuffer List parentStk = new List (); Stack inputStk = new Stack (); while ((currentNode = qyInput.Advance()) != null) { inputStk.Push(currentNode.Clone()); } while (inputStk.Count != 0) { XPathNavigator input = inputStk.Pop(); if (input.NodeType == XPathNodeType.Attribute || input.NodeType == XPathNodeType.Namespace) { continue; } if (NotVisited(input, parentStk)) { XPathNavigator prev = input.Clone(); if (prev.MoveToParent()) { bool test = prev.MoveToFirstChild(); Debug.Assert(test, "We just moved to parent, how we can not have first child?"); while (!prev.IsSamePosition(input)) { if (matches(prev)) { Insert(outputBuffer, prev); } if (!prev.MoveToNext()) { Debug.Fail("We managed to miss sentinel node (input)"); break; } } } } } return this; } public override XPathNodeIterator Clone() { return new PreSiblingQuery(this); } public override QueryProps Properties { get { return base.Properties | QueryProps.Reverse; } } } } // 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
- Attributes.cs
- WorkflowNamespace.cs
- TreeBuilder.cs
- StopStoryboard.cs
- KeyValueConfigurationElement.cs
- PowerStatus.cs
- SearchExpression.cs
- WebBrowser.cs
- HasCopySemanticsAttribute.cs
- CodeTypeDeclaration.cs
- ColorKeyFrameCollection.cs
- Logging.cs
- ProxyWebPartManager.cs
- StorageBasedPackageProperties.cs
- CodeVariableDeclarationStatement.cs
- XhtmlTextWriter.cs
- CalendarDay.cs
- ListMarkerSourceInfo.cs
- SchemaImporterExtension.cs
- ConditionValidator.cs
- SettingsAttributes.cs
- BuilderPropertyEntry.cs
- DecimalStorage.cs
- ProtocolsSection.cs
- StylusPlugInCollection.cs
- DataSpaceManager.cs
- DataSourceView.cs
- WindowsImpersonationContext.cs
- DocumentPage.cs
- XmlHierarchicalEnumerable.cs
- GradientBrush.cs
- DataDocumentXPathNavigator.cs
- ImpersonationContext.cs
- SslStreamSecurityBindingElement.cs
- ImageMap.cs
- TextAutomationPeer.cs
- TextServicesManager.cs
- sqlmetadatafactory.cs
- ToolStripRenderer.cs
- List.cs
- GB18030Encoding.cs
- MobilePage.cs
- InstanceContextManager.cs
- MergeFailedEvent.cs
- StorageRoot.cs
- IdentitySection.cs
- TargetConverter.cs
- PreviewPageInfo.cs
- HttpClientCertificate.cs
- UnsignedPublishLicense.cs
- FlowDocumentPaginator.cs
- SqlDataSourceConfigureFilterForm.cs
- ConfigurationLocationCollection.cs
- ModelFunction.cs
- OrderPreservingMergeHelper.cs
- CustomAttributeSerializer.cs
- SQlBooleanStorage.cs
- base64Transforms.cs
- EventLogPermissionEntry.cs
- BaseParaClient.cs
- CodeConstructor.cs
- Helpers.cs
- Rect3DValueSerializer.cs
- MD5.cs
- Socket.cs
- X509UI.cs
- CompilationLock.cs
- SourceLineInfo.cs
- PipelineDeploymentState.cs
- MatrixAnimationUsingKeyFrames.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- Error.cs
- RequestCachePolicyConverter.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- BuildProvidersCompiler.cs
- DivideByZeroException.cs
- SettingsPropertyValue.cs
- WeakReferenceList.cs
- ErrorEventArgs.cs
- mediapermission.cs
- TextDecorationCollectionConverter.cs
- ContractMapping.cs
- InspectionWorker.cs
- Track.cs
- ViewGenerator.cs
- InlineUIContainer.cs
- NavigationPropertySingletonExpression.cs
- ProfileSection.cs
- TextInfo.cs
- ArrayElementGridEntry.cs
- AuthenticationException.cs
- ValidationManager.cs
- ValueCollectionParameterReader.cs
- ColorConverter.cs
- HandlerMappingMemo.cs
- ToolStripRenderer.cs
- SignedXml.cs
- ProviderConnectionPointCollection.cs
- LineVisual.cs
- WriteFileContext.cs