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
- WebRequest.cs
- JournalNavigationScope.cs
- DESCryptoServiceProvider.cs
- FixedTextView.cs
- ZipFileInfo.cs
- MarkupCompilePass1.cs
- XmlLinkedNode.cs
- ComponentRenameEvent.cs
- ItemContainerPattern.cs
- RoleBoolean.cs
- BinaryObjectWriter.cs
- PeerCollaboration.cs
- PageBreakRecord.cs
- SkewTransform.cs
- Message.cs
- DataGridViewColumnEventArgs.cs
- PrivilegeNotHeldException.cs
- ProcessHostMapPath.cs
- ActivityExecutionContext.cs
- EditingCoordinator.cs
- CompileLiteralTextParser.cs
- AxHostDesigner.cs
- ProxyAttribute.cs
- QuerySelectOp.cs
- DataGridViewHeaderCell.cs
- ResourceReader.cs
- ObjectTag.cs
- BindingCompleteEventArgs.cs
- XPathEmptyIterator.cs
- UidManager.cs
- RIPEMD160.cs
- ToolStripCustomTypeDescriptor.cs
- BitSet.cs
- ObjectViewListener.cs
- base64Transforms.cs
- FrameworkElement.cs
- CustomBindingElementCollection.cs
- ContractListAdapter.cs
- CopyEncoder.cs
- AttributeQuery.cs
- HttpPostedFile.cs
- AutomationPatternInfo.cs
- ObjectStorage.cs
- _FixedSizeReader.cs
- ProfilePropertySettings.cs
- AnimationTimeline.cs
- ApplicationServicesHostFactory.cs
- ImageClickEventArgs.cs
- Permission.cs
- ContainerActivationHelper.cs
- _PooledStream.cs
- UriTemplateMatch.cs
- ListViewTableRow.cs
- PenLineCapValidation.cs
- ScriptComponentDescriptor.cs
- BooleanToVisibilityConverter.cs
- ButtonPopupAdapter.cs
- ActionItem.cs
- TypographyProperties.cs
- NameNode.cs
- SerialPort.cs
- Registry.cs
- Publisher.cs
- TypeNameConverter.cs
- Columns.cs
- FormViewCommandEventArgs.cs
- SubtreeProcessor.cs
- SqlInfoMessageEvent.cs
- DataGridViewCellValidatingEventArgs.cs
- DrawingContextDrawingContextWalker.cs
- ConfigurationManager.cs
- FamilyTypefaceCollection.cs
- PipelineModuleStepContainer.cs
- XmlException.cs
- DirectoryObjectSecurity.cs
- httpapplicationstate.cs
- RowBinding.cs
- EntitySqlQueryState.cs
- EntityDataSourceContextCreatedEventArgs.cs
- ClassHandlersStore.cs
- References.cs
- DateTimeEditor.cs
- EntityViewGenerator.cs
- TextEditorCopyPaste.cs
- GridViewRow.cs
- Configuration.cs
- DynamicRendererThreadManager.cs
- FixedNode.cs
- ZipIOExtraField.cs
- Crypto.cs
- StatusBar.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- Queue.cs
- DesignerSerializationOptionsAttribute.cs
- DelegatingStream.cs
- ModelEditingScope.cs
- SHA256.cs
- FixedNode.cs
- ObjectHandle.cs
- ColorConvertedBitmapExtension.cs