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
- Byte.cs
- RepeatButtonAutomationPeer.cs
- DeleteHelper.cs
- SystemPens.cs
- XmlSerializerSection.cs
- AvTraceDetails.cs
- oledbconnectionstring.cs
- UpdateExpressionVisitor.cs
- PingReply.cs
- PrintingPermission.cs
- StreamInfo.cs
- DataTableMappingCollection.cs
- BackStopAuthenticationModule.cs
- HostingEnvironmentSection.cs
- DefaultProxySection.cs
- UiaCoreApi.cs
- SerializationSectionGroup.cs
- LinqDataSourceDeleteEventArgs.cs
- MarkupWriter.cs
- PropertyStore.cs
- StrokeCollection.cs
- DrawingContextWalker.cs
- HttpApplicationStateWrapper.cs
- MarshalByRefObject.cs
- StyleConverter.cs
- Column.cs
- MessageSecurityVersionConverter.cs
- RowToParametersTransformer.cs
- XmlIgnoreAttribute.cs
- ManagedFilter.cs
- IISUnsafeMethods.cs
- LeafCellTreeNode.cs
- ImageField.cs
- WebPermission.cs
- GroupQuery.cs
- exports.cs
- StylusSystemGestureEventArgs.cs
- IDQuery.cs
- PageSetupDialog.cs
- MaxSessionCountExceededException.cs
- StylesEditorDialog.cs
- httpserverutility.cs
- COM2ICategorizePropertiesHandler.cs
- OleDbWrapper.cs
- HttpPostedFile.cs
- Simplifier.cs
- SettingsProviderCollection.cs
- ImageListStreamer.cs
- GenericUriParser.cs
- ConnectionModeReader.cs
- TableDetailsCollection.cs
- Metadata.cs
- AsymmetricSignatureDeformatter.cs
- BamlRecordWriter.cs
- ObfuscationAttribute.cs
- SerializationFieldInfo.cs
- BooleanConverter.cs
- XmlSchemaFacet.cs
- TemplatedWizardStep.cs
- ExceptionRoutedEventArgs.cs
- UpdatePanel.cs
- HtmlInputButton.cs
- XmlCompatibilityReader.cs
- DataTransferEventArgs.cs
- ChildTable.cs
- CodeGenerator.cs
- ApplicationDirectory.cs
- PeerNode.cs
- ImageAutomationPeer.cs
- Utils.cs
- GroupItemAutomationPeer.cs
- GeometryDrawing.cs
- WCFServiceClientProxyGenerator.cs
- FlowDocumentScrollViewer.cs
- OneWayElement.cs
- SqlNode.cs
- GridViewDesigner.cs
- SimpleLine.cs
- XmlSerializerAssemblyAttribute.cs
- ListBase.cs
- TreeNodeEventArgs.cs
- TrackingMemoryStream.cs
- CmsInterop.cs
- FileSystemInfo.cs
- Options.cs
- DataRowChangeEvent.cs
- ObjectDataSourceDisposingEventArgs.cs
- SqlMethodCallConverter.cs
- FragmentQueryKB.cs
- CounterCreationDataCollection.cs
- SettingsPropertyNotFoundException.cs
- TextServicesHost.cs
- SafeNativeMethodsMilCoreApi.cs
- SafePointer.cs
- AndCondition.cs
- ListItem.cs
- DiagnosticsConfigurationHandler.cs
- TreeWalker.cs
- unitconverter.cs
- X509CertificateCollection.cs