Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / QueryOperators / Inlined / FloatSumAggregationOperator.cs / 1305376 / FloatSumAggregationOperator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // FloatSumAggregationOperator.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for floats. /// internal sealed class FloatSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal FloatSumAggregationOperator(IEnumerable child) : base(child) { } //--------------------------------------------------------------------------------------- // Executes the entire query tree, and aggregates the intermediate results into the // final result based on the binary operators and final reduction. // // Return Value: // The single result of aggregation. // protected override float InternalAggregate(ref Exception singularExceptionToThrow) { // Because the final reduction is typically much cheaper than the intermediate // reductions over the individual partitions, and because each parallel partition // will do a lot of work to produce a single output element, we prefer to turn off // pipelining, and process the final reductions serially. using (IEnumerator enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true)) { // We just reduce the elements in each output partition. double sum = 0.0; while (enumerator.MoveNext()) { checked { sum += enumerator.Current; } } return (float)sum; } } //--------------------------------------------------------------------------------------- // Creates an enumerator that is used internally for the final aggregation step. // protected override QueryOperatorEnumerator CreateEnumerator ( int index, int count, QueryOperatorEnumerator source, object sharedData, CancellationToken cancellationToken) { return new FloatSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class FloatSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal FloatSumAggregationOperatorEnumerator(QueryOperatorEnumerator source, int partitionIndex, CancellationToken cancellationToken) : base(partitionIndex, cancellationToken) { Contract.Assert(source != null); m_source = source; } //--------------------------------------------------------------------------------------- // Tallies up the sum of the underlying data source, walking the entire thing the first // time MoveNext is called on this object. // protected override bool MoveNextCore(ref double currentElement) { float element = default(float); TKey keyUnused = default(TKey); QueryOperatorEnumerator source = m_source; if (source.MoveNext(ref element, ref keyUnused)) { // We just scroll through the enumerator and accumulate the sum. double tempSum = 0.0f; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); tempSum += element; } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = tempSum; return true; } return false; } //---------------------------------------------------------------------------------------- // Dispose of resources associated with the underlying enumerator. // protected override void Dispose(bool disposing) { Contract.Assert(m_source != null); m_source.Dispose(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // FloatSumAggregationOperator.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Threading; namespace System.Linq.Parallel { ////// An inlined sum aggregation and its enumerator, for floats. /// internal sealed class FloatSumAggregationOperator : InlinedAggregationOperator{ //---------------------------------------------------------------------------------------- // Constructs a new instance of a sum associative operator. // internal FloatSumAggregationOperator(IEnumerable child) : base(child) { } //--------------------------------------------------------------------------------------- // Executes the entire query tree, and aggregates the intermediate results into the // final result based on the binary operators and final reduction. // // Return Value: // The single result of aggregation. // protected override float InternalAggregate(ref Exception singularExceptionToThrow) { // Because the final reduction is typically much cheaper than the intermediate // reductions over the individual partitions, and because each parallel partition // will do a lot of work to produce a single output element, we prefer to turn off // pipelining, and process the final reductions serially. using (IEnumerator enumerator = GetEnumerator(ParallelMergeOptions.FullyBuffered, true)) { // We just reduce the elements in each output partition. double sum = 0.0; while (enumerator.MoveNext()) { checked { sum += enumerator.Current; } } return (float)sum; } } //--------------------------------------------------------------------------------------- // Creates an enumerator that is used internally for the final aggregation step. // protected override QueryOperatorEnumerator CreateEnumerator ( int index, int count, QueryOperatorEnumerator source, object sharedData, CancellationToken cancellationToken) { return new FloatSumAggregationOperatorEnumerator (source, index, cancellationToken); } //--------------------------------------------------------------------------------------- // This enumerator type encapsulates the intermediary aggregation over the underlying // (possibly partitioned) data source. // private class FloatSumAggregationOperatorEnumerator : InlinedAggregationOperatorEnumerator { private readonly QueryOperatorEnumerator m_source; // The source data. //---------------------------------------------------------------------------------------- // Instantiates a new aggregation operator. // internal FloatSumAggregationOperatorEnumerator(QueryOperatorEnumerator source, int partitionIndex, CancellationToken cancellationToken) : base(partitionIndex, cancellationToken) { Contract.Assert(source != null); m_source = source; } //--------------------------------------------------------------------------------------- // Tallies up the sum of the underlying data source, walking the entire thing the first // time MoveNext is called on this object. // protected override bool MoveNextCore(ref double currentElement) { float element = default(float); TKey keyUnused = default(TKey); QueryOperatorEnumerator source = m_source; if (source.MoveNext(ref element, ref keyUnused)) { // We just scroll through the enumerator and accumulate the sum. double tempSum = 0.0f; int i = 0; do { if ((i++ & CancellationState.POLL_INTERVAL) == 0) CancellationState.ThrowIfCanceled(m_cancellationToken); tempSum += element; } while (source.MoveNext(ref element, ref keyUnused)); // The sum has been calculated. Now just return. currentElement = tempSum; return true; } return false; } //---------------------------------------------------------------------------------------- // Dispose of resources associated with the underlying enumerator. // protected override void Dispose(bool disposing) { Contract.Assert(m_source != null); m_source.Dispose(); } } } } // 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
- EmptyEnumerator.cs
- SocketException.cs
- CompModSwitches.cs
- activationcontext.cs
- ConnectionPointCookie.cs
- DispatcherEventArgs.cs
- BlurBitmapEffect.cs
- InfiniteIntConverter.cs
- AssemblyAttributes.cs
- WebResponse.cs
- Rect3D.cs
- ToolboxItemAttribute.cs
- ManifestSignedXml.cs
- XsdDateTime.cs
- DesignerActionUIService.cs
- BaseTransportHeaders.cs
- AffineTransform3D.cs
- CompilationRelaxations.cs
- ProfileModule.cs
- PropertyDescriptorGridEntry.cs
- DependencyObjectType.cs
- DockPanel.cs
- MouseDevice.cs
- XD.cs
- TimeSpanMinutesConverter.cs
- LogEntrySerialization.cs
- OleDbDataAdapter.cs
- ParseHttpDate.cs
- RegisteredDisposeScript.cs
- PartitionedDataSource.cs
- Crc32.cs
- BindingsCollection.cs
- Win32SafeHandles.cs
- TemplateAction.cs
- HtmlUtf8RawTextWriter.cs
- DataConnectionHelper.cs
- MdiWindowListItemConverter.cs
- ErrorProvider.cs
- LoginAutoFormat.cs
- PeerInvitationResponse.cs
- TargetPerspective.cs
- InlinedAggregationOperator.cs
- ISCIIEncoding.cs
- GroupBoxRenderer.cs
- ImageBrush.cs
- ApplicationTrust.cs
- MenuItemCollectionEditorDialog.cs
- EUCJPEncoding.cs
- MouseGesture.cs
- MenuItemStyle.cs
- XmlEntityReference.cs
- FlowDocument.cs
- HttpListenerPrefixCollection.cs
- ScopelessEnumAttribute.cs
- CalendarAutoFormatDialog.cs
- FormViewInsertedEventArgs.cs
- mactripleDES.cs
- LogArchiveSnapshot.cs
- AbsoluteQuery.cs
- CustomAssemblyResolver.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- WsatAdminException.cs
- XmlElementList.cs
- ToolStripDropDownItem.cs
- XamlFigureLengthSerializer.cs
- ContextMarshalException.cs
- CompletedAsyncResult.cs
- FontStyle.cs
- PenCursorManager.cs
- AlternateViewCollection.cs
- FullTextBreakpoint.cs
- WorkflowLayouts.cs
- EditorPart.cs
- ExpressionBuilderCollection.cs
- TableRow.cs
- UserMapPath.cs
- InkCanvasInnerCanvas.cs
- NumberSubstitution.cs
- DataGridHelper.cs
- ScrollContentPresenter.cs
- HtmlSelect.cs
- PeerDuplexChannel.cs
- DefaultSection.cs
- DataGridState.cs
- PersonalizationEntry.cs
- MarshalByRefObject.cs
- _Rfc2616CacheValidators.cs
- StreamingContext.cs
- DynamicDataResources.Designer.cs
- XmlILAnnotation.cs
- XamlTypeMapper.cs
- TextTreeInsertElementUndoUnit.cs
- CodeConstructor.cs
- Color.cs
- StructuralCache.cs
- sitestring.cs
- SchemaMerger.cs
- ObsoleteAttribute.cs
- MailSettingsSection.cs
- _CookieModule.cs