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
- ControlPropertyNameConverter.cs
- CalendarDateChangedEventArgs.cs
- VisualTreeUtils.cs
- StringUtil.cs
- KeyValueInternalCollection.cs
- DataControlFieldTypeEditor.cs
- DataViewSetting.cs
- XmlProcessingInstruction.cs
- ConfigurationManagerInternalFactory.cs
- TextHidden.cs
- RootBrowserWindow.cs
- returneventsaver.cs
- AppDomainProtocolHandler.cs
- ApplicationServicesHostFactory.cs
- httpstaticobjectscollection.cs
- TableChangeProcessor.cs
- CurrentChangedEventManager.cs
- SqlInternalConnectionTds.cs
- ToolStripProgressBar.cs
- ScrollProviderWrapper.cs
- HttpCacheParams.cs
- ProfileSettingsCollection.cs
- EndpointAddressProcessor.cs
- ReceiveMessageAndVerifySecurityAsyncResultBase.cs
- ListBox.cs
- GAC.cs
- BamlReader.cs
- WindowsHyperlink.cs
- WebReferencesBuildProvider.cs
- ActivationServices.cs
- StrongNameSignatureInformation.cs
- UnsafeNetInfoNativeMethods.cs
- DrawingAttributesDefaultValueFactory.cs
- HtmlControl.cs
- VariableReference.cs
- GroupLabel.cs
- BaseParagraph.cs
- DataServiceStreamResponse.cs
- PackWebResponse.cs
- FigureParaClient.cs
- ExpressionBuilderCollection.cs
- WorkflowCompensationBehavior.cs
- FontUnitConverter.cs
- Pen.cs
- EastAsianLunisolarCalendar.cs
- PerformanceCounterManager.cs
- TimeoutValidationAttribute.cs
- CodeDefaultValueExpression.cs
- ProxyAttribute.cs
- WebBrowser.cs
- HitTestDrawingContextWalker.cs
- wgx_render.cs
- MimeAnyImporter.cs
- OrderedDictionary.cs
- _RequestCacheProtocol.cs
- MouseEventArgs.cs
- ElementUtil.cs
- SelfIssuedAuthRSAPKCS1SignatureFormatter.cs
- SctClaimSerializer.cs
- MsmqChannelFactory.cs
- DeviceFiltersSection.cs
- EndpointAddressAugust2004.cs
- IdentitySection.cs
- PresentationSource.cs
- TypeElement.cs
- StandardOleMarshalObject.cs
- PeerObject.cs
- QueryStringParameter.cs
- ImageSourceConverter.cs
- SessionEndedEventArgs.cs
- SystemGatewayIPAddressInformation.cs
- Rijndael.cs
- PermissionListSet.cs
- SqlException.cs
- RangeValidator.cs
- SurrogateSelector.cs
- PageAdapter.cs
- RichTextBox.cs
- ImageList.cs
- StickyNoteContentControl.cs
- DataServiceHost.cs
- Expressions.cs
- DateTimeStorage.cs
- FormattedTextSymbols.cs
- ResourceBinder.cs
- FontUnitConverter.cs
- ChannelManager.cs
- DictionarySectionHandler.cs
- HtmlInputPassword.cs
- MasterPageBuildProvider.cs
- UnSafeCharBuffer.cs
- PngBitmapDecoder.cs
- DesignerSerializerAttribute.cs
- SqlDataSourceFilteringEventArgs.cs
- XmlChildNodes.cs
- Application.cs
- InfoCardArgumentException.cs
- WebEventTraceProvider.cs
- WindowsStatusBar.cs
- NamespaceEmitter.cs