Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Utils / ExchangeUtilities.cs / 1305376 / ExchangeUtilities.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // ExchangeUtilities.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// ExchangeUtilities is a static class that contains helper functions to partition and merge /// streams. /// internal static class ExchangeUtilities { //------------------------------------------------------------------------------------ // A factory method to construct a partitioned stream over a data source. // // Arguments: // source - the data source to be partitioned // partitionCount - the number of partitions desired // useOrdinalOrderPreservation - whether ordinal position must be tracked // useStriping - whether striped partitioning should be used instead of range partitioning // internal static PartitionedStreamPartitionDataSource (IEnumerable source, int partitionCount, bool useStriping) { // The partitioned stream to return. PartitionedStream returnValue; IParallelPartitionable sourceAsPartitionable = source as IParallelPartitionable ; if (sourceAsPartitionable != null) { // The type overrides the partitioning algorithm, so we will use it instead of the default. // The returned enumerator must be the same size that we requested, otherwise we throw. QueryOperatorEnumerator [] enumerators = sourceAsPartitionable.GetPartitions(partitionCount); if (enumerators == null) { throw new InvalidOperationException(SR.GetString(SR.ParallelPartitionable_NullReturn)); } else if (enumerators.Length != partitionCount) { throw new InvalidOperationException(SR.GetString(SR.ParallelPartitionable_IncorretElementCount)); } // Now just copy the enumerators into the stream, validating that the result is non-null. PartitionedStream stream = new PartitionedStream (partitionCount, Util.GetDefaultComparer (), OrdinalIndexState.Correct); for (int i = 0; i < partitionCount; i++) { QueryOperatorEnumerator currentEnumerator = enumerators[i]; if (currentEnumerator == null) { throw new InvalidOperationException(SR.GetString(SR.ParallelPartitionable_NullElement)); } stream[i] = currentEnumerator; } returnValue = stream; } else { returnValue = new PartitionedDataSource (source, partitionCount, useStriping); } Contract.Assert(returnValue.PartitionCount == partitionCount); return returnValue; } //----------------------------------------------------------------------------------- // Converts an enumerator or a partitioned stream into a hash-partitioned stream. In the resulting // partitioning, all elements with the same hash code are guaranteed to be in the same partition. // // Arguments: // source - the data to be hash-partitioned. If it is a partitioned stream, it // must have partitionCount partitions // partitionCount - the desired number of partitions // useOrdinalOrderPreservation - whether ordinal order preservation is required // keySelector - function to obtain the key given an element // keyComparer - equality comparer for the keys // internal static PartitionedStream , int> HashRepartition ( PartitionedStream source, Func keySelector, IEqualityComparer keyComparer, IEqualityComparer elementComparer, CancellationToken cancellationToken) { TraceHelpers.TraceInfo("PartitionStream<..>.HashRepartitionStream(..):: creating **RE**partitioned stream for nested operator"); return new UnorderedHashRepartitionStream (source, keySelector, keyComparer, elementComparer, cancellationToken); } internal static PartitionedStream , TOrderKey> HashRepartitionOrdered ( PartitionedStream source, Func keySelector, IEqualityComparer keyComparer, IEqualityComparer elementComparer, CancellationToken cancellationToken) { TraceHelpers.TraceInfo("PartitionStream<..>.HashRepartitionStream(..):: creating **RE**partitioned stream for nested operator"); return new OrderedHashRepartitionStream (source, keySelector, keyComparer, elementComparer, cancellationToken); } //--------------------------------------------------------------------------------------- // A helper method that given two OrdinalIndexState values return the "worse" one. For // example, if state1 is valid and state2 is increasing, we will return // OrdinalIndexState.Increasing. // internal static OrdinalIndexState Worse(this OrdinalIndexState state1, OrdinalIndexState state2) { return state1 > state2 ? state1 : state2; } internal static bool IsWorseThan(this OrdinalIndexState state1, OrdinalIndexState state2) { return state1 > state2; } } /// /// Used during hash partitioning, when the keys being memoized are not used for anything. /// internal struct NoKeyMemoizationRequired { } } // 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
- Command.cs
- StatusBarItemAutomationPeer.cs
- ResourceDictionaryCollection.cs
- MailSettingsSection.cs
- CngKey.cs
- DeclarativeCatalogPart.cs
- IntegrationExceptionEventArgs.cs
- PropertyHelper.cs
- ArcSegment.cs
- VirtualDirectoryMapping.cs
- NeutralResourcesLanguageAttribute.cs
- CharStorage.cs
- FixedSOMTextRun.cs
- XsltArgumentList.cs
- OptimizedTemplateContentHelper.cs
- GeneralTransform3DTo2D.cs
- PngBitmapDecoder.cs
- LabelEditEvent.cs
- Dictionary.cs
- HotCommands.cs
- MorphHelper.cs
- StorageBasedPackageProperties.cs
- TypeUnloadedException.cs
- TypeDescriptionProviderAttribute.cs
- PointUtil.cs
- ACE.cs
- QilPatternFactory.cs
- GridViewDeleteEventArgs.cs
- SqlReferenceCollection.cs
- SecuritySessionFilter.cs
- DNS.cs
- WindowsImpersonationContext.cs
- SystemIPv6InterfaceProperties.cs
- ForceCopyBuildProvider.cs
- PolyLineSegmentFigureLogic.cs
- MemberPath.cs
- FixedPosition.cs
- PtsHelper.cs
- ObjectDataProvider.cs
- DynamicResourceExtension.cs
- SqlCommand.cs
- WebPartsSection.cs
- QuaternionAnimation.cs
- CheckBoxAutomationPeer.cs
- ContextToken.cs
- LineBreak.cs
- AndCondition.cs
- ReceiveActivity.cs
- DesignerHelpers.cs
- CodeStatement.cs
- Pair.cs
- RangeContentEnumerator.cs
- EUCJPEncoding.cs
- UnicodeEncoding.cs
- XmlSchemaObjectTable.cs
- WeakRefEnumerator.cs
- Application.cs
- Overlapped.cs
- GeneralTransform.cs
- MetadataSection.cs
- TerminateSequence.cs
- FileCodeGroup.cs
- PersonalizableTypeEntry.cs
- RemoteWebConfigurationHostServer.cs
- MdiWindowListItemConverter.cs
- HtmlAnchor.cs
- DataSourceHelper.cs
- Int64KeyFrameCollection.cs
- StandardOleMarshalObject.cs
- CornerRadius.cs
- WindowsPen.cs
- QueryCursorEventArgs.cs
- StartFileNameEditor.cs
- WriteableOnDemandStream.cs
- DecimalAnimationUsingKeyFrames.cs
- ColorTransformHelper.cs
- IProducerConsumerCollection.cs
- ResourceAttributes.cs
- ObjectDataSource.cs
- CodeVariableReferenceExpression.cs
- XsdCachingReader.cs
- RawStylusInputReport.cs
- ObjectDataSourceMethodEventArgs.cs
- TraceLevelStore.cs
- LicenseManager.cs
- DetailsViewRow.cs
- WaitHandle.cs
- XsdBuildProvider.cs
- ContainerControlDesigner.cs
- DictionaryManager.cs
- ThaiBuddhistCalendar.cs
- ProviderConnectionPoint.cs
- DrawingAttributeSerializer.cs
- RawStylusInputCustomData.cs
- LinearGradientBrush.cs
- cookieexception.cs
- ExceptionTrace.cs
- CTreeGenerator.cs
- RightsManagementEncryptionTransform.cs
- ArgumentNullException.cs