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, 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.
//
// [....]
//-----------------------------------------------------------------------------
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, 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UnsafeNativeMethods.cs
- ObjectPersistData.cs
- TypedDataSetSchemaImporterExtensionFx35.cs
- CompositeFontParser.cs
- RestHandlerFactory.cs
- XmlnsDefinitionAttribute.cs
- ReadOnlyCollection.cs
- DiscoveryProxy.cs
- UniqueConstraint.cs
- WebPartConnectionCollection.cs
- StringValidatorAttribute.cs
- HttpApplicationFactory.cs
- EdmValidator.cs
- TreeViewEvent.cs
- BuildProviderCollection.cs
- FixedTextSelectionProcessor.cs
- MouseCaptureWithinProperty.cs
- Component.cs
- D3DImage.cs
- StrokeNodeOperations2.cs
- QueryTaskGroupState.cs
- XmlWriterDelegator.cs
- StylusPlugin.cs
- ColumnMapTranslator.cs
- BitmapInitialize.cs
- LineInfo.cs
- FileChangesMonitor.cs
- BeginStoryboard.cs
- FunctionUpdateCommand.cs
- AccessibilityApplicationManager.cs
- PeerSecurityHelpers.cs
- ReadOnlyPropertyMetadata.cs
- FixedHyperLink.cs
- FindCriteriaElement.cs
- RadialGradientBrush.cs
- ColorTransformHelper.cs
- StaticSiteMapProvider.cs
- XmlNode.cs
- Transform.cs
- WebBrowser.cs
- SspiSafeHandles.cs
- ResourceDictionaryCollection.cs
- SqlBooleanMismatchVisitor.cs
- BinaryFormatterSinks.cs
- DataConnectionHelper.cs
- basecomparevalidator.cs
- MemoryStream.cs
- DesignTimeParseData.cs
- NCryptNative.cs
- FocusChangedEventArgs.cs
- FixedSOMContainer.cs
- EntitySetDataBindingList.cs
- TargetException.cs
- HeaderPanel.cs
- RadioButton.cs
- PaperSize.cs
- KeyPressEvent.cs
- invalidudtexception.cs
- SpecularMaterial.cs
- EventData.cs
- SemanticResultValue.cs
- RoamingStoreFileUtility.cs
- NativeObjectSecurity.cs
- DbParameterCollection.cs
- SequentialOutput.cs
- XhtmlBasicLiteralTextAdapter.cs
- QueryComponents.cs
- JoinElimination.cs
- SqlInternalConnection.cs
- FileDataSourceCache.cs
- FixedSOMTableRow.cs
- SynchronizationValidator.cs
- TabletCollection.cs
- DynamicScriptObject.cs
- SecurityDocument.cs
- OrderedDictionary.cs
- MenuRendererStandards.cs
- UIHelper.cs
- XmlWrappingReader.cs
- OptimalBreakSession.cs
- WebPartEditorOkVerb.cs
- Int64KeyFrameCollection.cs
- WinFormsComponentEditor.cs
- SpellerStatusTable.cs
- ContextBase.cs
- HotCommands.cs
- _UriSyntax.cs
- XmlException.cs
- TextEditorThreadLocalStore.cs
- OleDbDataReader.cs
- Attributes.cs
- DiscoveryOperationContextExtension.cs
- ConsoleTraceListener.cs
- Token.cs
- DrawingBrush.cs
- ResolveDuplexCD1AsyncResult.cs
- WebPartsPersonalizationAuthorization.cs
- ModelUIElement3D.cs
- WebPartDisplayModeCancelEventArgs.cs
- ErrorStyle.cs