Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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 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
- CopyNodeSetAction.cs
- StdValidatorsAndConverters.cs
- ErrorTableItemStyle.cs
- SoundPlayer.cs
- PackUriHelper.cs
- VectorAnimationBase.cs
- LinqMaximalSubtreeNominator.cs
- NgenServicingAttributes.cs
- RightsManagementInformation.cs
- RepeaterDataBoundAdapter.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- ClientRolePrincipal.cs
- LogReservationCollection.cs
- UndirectedGraph.cs
- Region.cs
- BindingsCollection.cs
- DependencyObjectPropertyDescriptor.cs
- BoundColumn.cs
- ObjectSet.cs
- PageEventArgs.cs
- EpmCustomContentDeSerializer.cs
- FixedTextBuilder.cs
- CommandField.cs
- EditorPart.cs
- XmlMapping.cs
- OpenFileDialog.cs
- ListViewTableCell.cs
- HostingPreferredMapPath.cs
- OleDbException.cs
- GreaterThan.cs
- PolyQuadraticBezierSegment.cs
- PriorityQueue.cs
- DefaultValueConverter.cs
- TableLayoutStyleCollection.cs
- DataGridViewComboBoxColumn.cs
- DispatcherExceptionEventArgs.cs
- FilterException.cs
- CaseInsensitiveHashCodeProvider.cs
- RepeaterDataBoundAdapter.cs
- ConstructorExpr.cs
- WebException.cs
- DashStyle.cs
- GroupItemAutomationPeer.cs
- _AutoWebProxyScriptEngine.cs
- ConfigurationConverterBase.cs
- PTProvider.cs
- KeyValuePair.cs
- MDIControlStrip.cs
- CodeMethodInvokeExpression.cs
- Canvas.cs
- WinEventTracker.cs
- ListControl.cs
- COM2PropertyDescriptor.cs
- Scene3D.cs
- WebBrowserDocumentCompletedEventHandler.cs
- StreamInfo.cs
- EncryptedData.cs
- DbSourceParameterCollection.cs
- UpDownEvent.cs
- DependencyPropertyKind.cs
- ConnectionOrientedTransportManager.cs
- BufferedGraphicsContext.cs
- RequestQueryProcessor.cs
- NumberFormatInfo.cs
- BrowserCapabilitiesFactory35.cs
- WindowsFormsSynchronizationContext.cs
- Subtree.cs
- QueryPageSettingsEventArgs.cs
- AuthorizationRuleCollection.cs
- RadioButtonDesigner.cs
- ProjectionCamera.cs
- Debug.cs
- VScrollBar.cs
- SafeSecurityHandles.cs
- ServiceNameElement.cs
- SqlPersonalizationProvider.cs
- TransformCryptoHandle.cs
- DataGridViewButtonColumn.cs
- CacheAxisQuery.cs
- ObjectStateFormatter.cs
- CommandValueSerializer.cs
- SerTrace.cs
- ReadOnlyCollection.cs
- ConfigurationStrings.cs
- DataGridItem.cs
- DataGridViewComboBoxColumn.cs
- Psha1DerivedKeyGenerator.cs
- LockCookie.cs
- WebPartConnectionsDisconnectVerb.cs
- VectorKeyFrameCollection.cs
- TemplateField.cs
- PaintEvent.cs
- TypeDescriptionProvider.cs
- TemplateXamlTreeBuilder.cs
- ControlCollection.cs
- FormattedText.cs
- AddInServer.cs
- DataGridRow.cs
- Clipboard.cs
- CodeDomConfigurationHandler.cs