Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BitmapCache.cs
- Material.cs
- ProvidersHelper.cs
- XPathScanner.cs
- ZoomingMessageFilter.cs
- XmlSchemaExporter.cs
- PointHitTestParameters.cs
- CompiledAction.cs
- ToolboxItemCollection.cs
- AddInPipelineAttributes.cs
- UnmanagedMemoryStream.cs
- PackageRelationshipSelector.cs
- WebMessageEncodingBindingElement.cs
- Maps.cs
- ViewCellRelation.cs
- SoapException.cs
- MouseDevice.cs
- DiscoveryService.cs
- ServiceNotStartedException.cs
- DictionaryBase.cs
- ScrollChrome.cs
- Point3DConverter.cs
- PointCollection.cs
- ToolstripProfessionalRenderer.cs
- CompatibleComparer.cs
- WebServiceAttribute.cs
- OleDbTransaction.cs
- Rotation3D.cs
- TableStyle.cs
- DataGridViewCellPaintingEventArgs.cs
- UrlMappingsSection.cs
- Expression.cs
- Socket.cs
- DispatchChannelSink.cs
- AttributeData.cs
- CodeAttributeDeclaration.cs
- PageThemeParser.cs
- HtmlInputCheckBox.cs
- externdll.cs
- StringExpressionSet.cs
- ipaddressinformationcollection.cs
- TrackingServices.cs
- XmlElementList.cs
- XmlReaderSettings.cs
- ProfileService.cs
- ProtocolReflector.cs
- XamlUtilities.cs
- WrappedIUnknown.cs
- QilPatternVisitor.cs
- PrtTicket_Base.cs
- EntityClientCacheKey.cs
- ReferencedAssembly.cs
- UnsafeNativeMethods.cs
- TraceRecords.cs
- RecognitionResult.cs
- keycontainerpermission.cs
- ExtractedStateEntry.cs
- HashSetEqualityComparer.cs
- Substitution.cs
- NonClientArea.cs
- XmlSerializerOperationBehavior.cs
- StrongNameIdentityPermission.cs
- ReverseInheritProperty.cs
- TextEditorMouse.cs
- HttpModulesSection.cs
- SimpleRecyclingCache.cs
- SelectionGlyph.cs
- RootBuilder.cs
- ZipIOExtraField.cs
- BCLDebug.cs
- SessionPageStateSection.cs
- ResourceIDHelper.cs
- ComponentCommands.cs
- ScrollContentPresenter.cs
- NativeRecognizer.cs
- DLinqTableProvider.cs
- TabPanel.cs
- ColumnHeader.cs
- SqlBulkCopyColumnMappingCollection.cs
- Aggregates.cs
- SmiRequestExecutor.cs
- ReadWriteObjectLock.cs
- InputProcessorProfilesLoader.cs
- WorkItem.cs
- TypeBrowser.xaml.cs
- StrongNameIdentityPermission.cs
- XmlName.cs
- SineEase.cs
- Classification.cs
- RightNameExpirationInfoPair.cs
- XmlTypeAttribute.cs
- NextPreviousPagerField.cs
- ToolStripGripRenderEventArgs.cs
- AudioLevelUpdatedEventArgs.cs
- WebBaseEventKeyComparer.cs
- MarkupCompilePass2.cs
- RemotingConfigParser.cs
- VisualStyleElement.cs
- BaseResourcesBuildProvider.cs
- BaseProcessor.cs