Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / Runtime / DodSequenceMerge.cs / 1305376 / DodSequenceMerge.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Xml.XPath;
using System.Diagnostics;
using System.Globalization;
using System.ComponentModel;
namespace System.Xml.Xsl.Runtime {
///
/// Merges several doc-order-distinct sequences into a single doc-order-distinct sequence.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public struct DodSequenceMerge {
private IList firstSequence;
private List> sequencesToMerge;
private int nodeCount;
private XmlQueryRuntime runtime;
///
/// Initialize this instance of DodSequenceMerge.
///
public void Create(XmlQueryRuntime runtime) {
this.firstSequence = null;
this.sequencesToMerge = null;
this.nodeCount = 0;
this.runtime = runtime;
}
///
/// Add a new sequence to the list of sequences to merge.
///
public void AddSequence(IList sequence) {
// Ignore empty sequences
if (sequence.Count == 0)
return;
if (this.firstSequence == null) {
this.firstSequence = sequence;
}
else {
if (this.sequencesToMerge == null) {
this.sequencesToMerge = new List>();
MoveAndInsertSequence(this.firstSequence.GetEnumerator());
this.nodeCount = this.firstSequence.Count;
}
MoveAndInsertSequence(sequence.GetEnumerator());
this.nodeCount += sequence.Count;
}
}
///
/// Return the fully merged sequence.
///
public IList MergeSequences() {
XmlQueryNodeSequence newSequence;
// Zero sequences to merge
if (this.firstSequence == null)
return XmlQueryNodeSequence.Empty;
// One sequence to merge
if (this.sequencesToMerge == null || this.sequencesToMerge.Count <= 1)
return this.firstSequence;
// Two or more sequences to merge
newSequence = new XmlQueryNodeSequence(this.nodeCount);
while (this.sequencesToMerge.Count != 1) {
// Save last item in list in temp variable, and remove it from list
IEnumerator sequence = this.sequencesToMerge[this.sequencesToMerge.Count - 1];
this.sequencesToMerge.RemoveAt(this.sequencesToMerge.Count - 1);
// Add current node to merged sequence
newSequence.Add(sequence.Current);
// Now move to the next node, and re-insert it into the list in reverse document order
MoveAndInsertSequence(sequence);
}
// Add nodes in remaining sequence to end of list
Debug.Assert(this.sequencesToMerge.Count == 1, "While loop should terminate when count == 1");
do {
newSequence.Add(this.sequencesToMerge[0].Current);
}
while (this.sequencesToMerge[0].MoveNext());
return newSequence;
}
///
/// Move to the next item in the sequence. If there is no next item, then do not
/// insert the sequence. Otherwise, call InsertSequence.
///
private void MoveAndInsertSequence(IEnumerator sequence) {
if (sequence.MoveNext())
InsertSequence(sequence);
}
///
/// Insert the specified sequence into the list of sequences to be merged.
/// Insert it in reverse document order with respect to the current nodes in other sequences.
///
private void InsertSequence(IEnumerator sequence) {
for (int i = this.sequencesToMerge.Count - 1; i >= 0; i--) {
int cmp = this.runtime.ComparePosition(sequence.Current, this.sequencesToMerge[i].Current);
if (cmp == -1) {
// Insert after current item
this.sequencesToMerge.Insert(i + 1, sequence);
return;
}
else if (cmp == 0) {
// Found duplicate, so skip the duplicate
if (!sequence.MoveNext()) {
// No more nodes, so don't insert anything
return;
}
// Next node must be after current node in document order, so don't need to reset loop
}
}
// Insert at beginning of list
this.sequencesToMerge.Insert(0, sequence);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Xml.XPath;
using System.Diagnostics;
using System.Globalization;
using System.ComponentModel;
namespace System.Xml.Xsl.Runtime {
///
/// Merges several doc-order-distinct sequences into a single doc-order-distinct sequence.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public struct DodSequenceMerge {
private IList firstSequence;
private List> sequencesToMerge;
private int nodeCount;
private XmlQueryRuntime runtime;
///
/// Initialize this instance of DodSequenceMerge.
///
public void Create(XmlQueryRuntime runtime) {
this.firstSequence = null;
this.sequencesToMerge = null;
this.nodeCount = 0;
this.runtime = runtime;
}
///
/// Add a new sequence to the list of sequences to merge.
///
public void AddSequence(IList sequence) {
// Ignore empty sequences
if (sequence.Count == 0)
return;
if (this.firstSequence == null) {
this.firstSequence = sequence;
}
else {
if (this.sequencesToMerge == null) {
this.sequencesToMerge = new List>();
MoveAndInsertSequence(this.firstSequence.GetEnumerator());
this.nodeCount = this.firstSequence.Count;
}
MoveAndInsertSequence(sequence.GetEnumerator());
this.nodeCount += sequence.Count;
}
}
///
/// Return the fully merged sequence.
///
public IList MergeSequences() {
XmlQueryNodeSequence newSequence;
// Zero sequences to merge
if (this.firstSequence == null)
return XmlQueryNodeSequence.Empty;
// One sequence to merge
if (this.sequencesToMerge == null || this.sequencesToMerge.Count <= 1)
return this.firstSequence;
// Two or more sequences to merge
newSequence = new XmlQueryNodeSequence(this.nodeCount);
while (this.sequencesToMerge.Count != 1) {
// Save last item in list in temp variable, and remove it from list
IEnumerator sequence = this.sequencesToMerge[this.sequencesToMerge.Count - 1];
this.sequencesToMerge.RemoveAt(this.sequencesToMerge.Count - 1);
// Add current node to merged sequence
newSequence.Add(sequence.Current);
// Now move to the next node, and re-insert it into the list in reverse document order
MoveAndInsertSequence(sequence);
}
// Add nodes in remaining sequence to end of list
Debug.Assert(this.sequencesToMerge.Count == 1, "While loop should terminate when count == 1");
do {
newSequence.Add(this.sequencesToMerge[0].Current);
}
while (this.sequencesToMerge[0].MoveNext());
return newSequence;
}
///
/// Move to the next item in the sequence. If there is no next item, then do not
/// insert the sequence. Otherwise, call InsertSequence.
///
private void MoveAndInsertSequence(IEnumerator sequence) {
if (sequence.MoveNext())
InsertSequence(sequence);
}
///
/// Insert the specified sequence into the list of sequences to be merged.
/// Insert it in reverse document order with respect to the current nodes in other sequences.
///
private void InsertSequence(IEnumerator sequence) {
for (int i = this.sequencesToMerge.Count - 1; i >= 0; i--) {
int cmp = this.runtime.ComparePosition(sequence.Current, this.sequencesToMerge[i].Current);
if (cmp == -1) {
// Insert after current item
this.sequencesToMerge.Insert(i + 1, sequence);
return;
}
else if (cmp == 0) {
// Found duplicate, so skip the duplicate
if (!sequence.MoveNext()) {
// No more nodes, so don't insert anything
return;
}
// Next node must be after current node in document order, so don't need to reset loop
}
}
// Insert at beginning of list
this.sequencesToMerge.Insert(0, sequence);
}
}
}
// 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
- SpellerInterop.cs
- XmlWhitespace.cs
- FormViewRow.cs
- IdnMapping.cs
- SynchronizationLockException.cs
- AdornerPresentationContext.cs
- SHA384.cs
- PaintEvent.cs
- SqlRewriteScalarSubqueries.cs
- MessageFilter.cs
- OptimizerPatterns.cs
- RootBrowserWindow.cs
- TargetControlTypeCache.cs
- ColorDialog.cs
- EntitySqlQueryCacheEntry.cs
- TypeResolver.cs
- TaskHelper.cs
- MergeEnumerator.cs
- ISessionStateStore.cs
- TempFiles.cs
- BamlBinaryWriter.cs
- ResourceFallbackManager.cs
- EncoderExceptionFallback.cs
- RegexParser.cs
- MgmtConfigurationRecord.cs
- EncoderParameters.cs
- XmlToDatasetMap.cs
- Exception.cs
- XmlDigitalSignatureProcessor.cs
- CompilerLocalReference.cs
- InstanceCompleteException.cs
- SystemWebExtensionsSectionGroup.cs
- GeneratedContractType.cs
- ResourceDescriptionAttribute.cs
- CheckBoxRenderer.cs
- LinqDataSource.cs
- DataTable.cs
- DateTimeHelper.cs
- WindowsStatic.cs
- DashStyles.cs
- ISessionStateStore.cs
- FileSecurity.cs
- XmlAnyAttributeAttribute.cs
- SRDisplayNameAttribute.cs
- Compiler.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- SectionRecord.cs
- ResourceBinder.cs
- PersonalizationDictionary.cs
- ContentTextAutomationPeer.cs
- AddInDeploymentState.cs
- OracleConnectionStringBuilder.cs
- ConfigXmlCDataSection.cs
- DataGridViewImageCell.cs
- AttributeAction.cs
- Page.cs
- StartUpEventArgs.cs
- StoreItemCollection.cs
- XmlSchemaSimpleType.cs
- TreeNodeCollection.cs
- DependencyPropertyValueSerializer.cs
- HtmlSelect.cs
- RegexMatch.cs
- VarRemapper.cs
- PreservationFileReader.cs
- WebPartPersonalization.cs
- ContentDisposition.cs
- GACIdentityPermission.cs
- Matrix3D.cs
- ExitEventArgs.cs
- NonParentingControl.cs
- DataGridPageChangedEventArgs.cs
- EventDescriptorCollection.cs
- ManagedFilter.cs
- DesignerActionTextItem.cs
- NoneExcludedImageIndexConverter.cs
- EventTrigger.cs
- WebBrowserPermission.cs
- RelationshipManager.cs
- ZoneMembershipCondition.cs
- FileDataSourceCache.cs
- ReadOnlyAttribute.cs
- IImplicitResourceProvider.cs
- XmlSchemaImporter.cs
- CodeTypeMemberCollection.cs
- SqlCacheDependency.cs
- OraclePermission.cs
- FullTextBreakpoint.cs
- WebBrowsableAttribute.cs
- IgnoreFileBuildProvider.cs
- HttpRuntimeSection.cs
- IntSecurity.cs
- QueryInterceptorAttribute.cs
- Int32.cs
- InputBinder.cs
- SiteMapPath.cs
- SemaphoreSecurity.cs
- NGCPageContentCollectionSerializerAsync.cs
- ToolStripItem.cs
- BitmapEffectInputData.cs