Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / fx / src / Xml / System / Xml / XPath / Internal / precedingsibling.cs / 1 / 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
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, List parentStk){
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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataGridViewCellFormattingEventArgs.cs
- XamlSerializationHelper.cs
- StreamInfo.cs
- MergablePropertyAttribute.cs
- StringCollection.cs
- DateTimeConverter2.cs
- SqlInternalConnectionTds.cs
- SeekableReadStream.cs
- ValidationErrorEventArgs.cs
- ControlPaint.cs
- ServiceNameCollection.cs
- SizeChangedInfo.cs
- EntityParameterCollection.cs
- InfoCardBaseException.cs
- ResponseBodyWriter.cs
- DropShadowBitmapEffect.cs
- JavaScriptObjectDeserializer.cs
- AutomationIdentifierGuids.cs
- XsltException.cs
- QilChoice.cs
- Rijndael.cs
- EditorPart.cs
- GlyphRun.cs
- Empty.cs
- StringDictionary.cs
- AssemblyFilter.cs
- LoginCancelEventArgs.cs
- FigureParagraph.cs
- EntityRecordInfo.cs
- ToolStripSplitButton.cs
- HttpCapabilitiesBase.cs
- TypeForwardedFromAttribute.cs
- TemplateComponentConnector.cs
- MaskPropertyEditor.cs
- PrintPreviewGraphics.cs
- FileSecurity.cs
- BrushMappingModeValidation.cs
- QilNode.cs
- StringUtil.cs
- designeractionlistschangedeventargs.cs
- TextEditorCharacters.cs
- ServiceEndpoint.cs
- ElapsedEventArgs.cs
- DeviceSpecificChoiceCollection.cs
- BatchParser.cs
- OptimisticConcurrencyException.cs
- ThicknessKeyFrameCollection.cs
- Convert.cs
- EntityDataSourceDesigner.cs
- RegexCode.cs
- DbProviderServices.cs
- MatrixTransform.cs
- CodeArrayCreateExpression.cs
- HMACSHA256.cs
- Clock.cs
- LinkConverter.cs
- WindowsStatic.cs
- DataRelationPropertyDescriptor.cs
- NavigationProgressEventArgs.cs
- TableRow.cs
- FileLogRecordEnumerator.cs
- SplitContainer.cs
- Tracer.cs
- HtmlInputImage.cs
- Compiler.cs
- SortKey.cs
- SessionStateSection.cs
- SqlRowUpdatingEvent.cs
- HtmlToClrEventProxy.cs
- TdsParameterSetter.cs
- FlowLayoutSettings.cs
- AuthenticationModuleElement.cs
- XmlProcessingInstruction.cs
- XamlInt32CollectionSerializer.cs
- ImageCollectionCodeDomSerializer.cs
- Canvas.cs
- TransactionManager.cs
- DataGridViewCheckBoxColumn.cs
- Internal.cs
- TextLine.cs
- TreeWalker.cs
- FontCacheLogic.cs
- DetailsView.cs
- ExtensionSimplifierMarkupObject.cs
- ListBoxChrome.cs
- ExpressionBuilderContext.cs
- StylusPlugin.cs
- BrowserDefinitionCollection.cs
- HtmlInputFile.cs
- IndexedString.cs
- SoapEnumAttribute.cs
- QuestionEventArgs.cs
- SortedList.cs
- ListBoxItemAutomationPeer.cs
- DesignOnlyAttribute.cs
- SettingsProperty.cs
- SystemGatewayIPAddressInformation.cs
- Triangle.cs
- SapiRecoContext.cs
- ReadOnlyMetadataCollection.cs