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
- ItemList.cs
- CodeAttachEventStatement.cs
- FlowLayoutPanel.cs
- SponsorHelper.cs
- PageCodeDomTreeGenerator.cs
- Misc.cs
- ResourceAssociationTypeEnd.cs
- HttpCookieCollection.cs
- BamlRecordReader.cs
- RoutedEventArgs.cs
- WebServiceResponseDesigner.cs
- DeleteIndexBinder.cs
- DataServiceExpressionVisitor.cs
- UnicodeEncoding.cs
- ServerValidateEventArgs.cs
- AuthorizationSection.cs
- XmlStreamNodeWriter.cs
- ThreadExceptionDialog.cs
- WorkflowTimerService.cs
- ShortcutKeysEditor.cs
- HScrollBar.cs
- FormatConvertedBitmap.cs
- ExecutedRoutedEventArgs.cs
- FixUpCollection.cs
- LogLogRecordHeader.cs
- compensatingcollection.cs
- GC.cs
- FormsAuthenticationConfiguration.cs
- ApplicationManager.cs
- ZipIOLocalFileHeader.cs
- MarshalByRefObject.cs
- HttpCookieCollection.cs
- ExclusiveCanonicalizationTransform.cs
- XmlEncoding.cs
- InstanceDescriptor.cs
- TransformDescriptor.cs
- ScopelessEnumAttribute.cs
- PositiveTimeSpanValidatorAttribute.cs
- Processor.cs
- ExpressionLexer.cs
- MenuItemStyleCollection.cs
- RowParagraph.cs
- QueryContinueDragEvent.cs
- WinEventHandler.cs
- MetadataSource.cs
- CodeNamespaceImportCollection.cs
- HttpInputStream.cs
- SQLString.cs
- Control.cs
- AccessKeyManager.cs
- TagPrefixInfo.cs
- ScrollBarAutomationPeer.cs
- ProtocolViolationException.cs
- TableLayoutStyle.cs
- OpCodes.cs
- BinaryObjectReader.cs
- RequiredAttributeAttribute.cs
- PropertyItemInternal.cs
- MatrixStack.cs
- HuffModule.cs
- HtmlControlPersistable.cs
- AttributeAction.cs
- HttpStreamMessageEncoderFactory.cs
- WasEndpointConfigContainer.cs
- x509store.cs
- ByteRangeDownloader.cs
- XmlWriterTraceListener.cs
- HttpHandlerAction.cs
- AssociatedControlConverter.cs
- SecurityCriticalDataForSet.cs
- PointLight.cs
- ReadOnlyCollectionBase.cs
- TextEditorLists.cs
- DesignColumnCollection.cs
- TypeUtil.cs
- HMACSHA1.cs
- ParentQuery.cs
- Pair.cs
- OleDbError.cs
- DelegateSerializationHolder.cs
- LinearKeyFrames.cs
- FullTextBreakpoint.cs
- FacetChecker.cs
- SystemColorTracker.cs
- handlecollector.cs
- ChannelEndpointElementCollection.cs
- UIElementParaClient.cs
- EdmMember.cs
- HtmlInputControl.cs
- TableLayoutPanel.cs
- Exceptions.cs
- AssemblyResourceLoader.cs
- PackWebRequestFactory.cs
- CacheMemory.cs
- MenuItemStyleCollection.cs
- XmlComplianceUtil.cs
- FigureHelper.cs
- PermissionSetTriple.cs
- UnsafeNativeMethods.cs
- Button.cs