Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Enumerables / RepeatEnumerable.cs / 1305376 / RepeatEnumerable.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // RepeatEnumerable.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// A simple enumerable type that implements the repeat algorithm. It also supports /// partitioning of the count space by implementing an interface that PLINQ recognizes. /// ///internal class RepeatEnumerable : ParallelQuery , IParallelPartitionable { private TResult m_element; // Element value to repeat. private int m_count; // Count of element values. //------------------------------------------------------------------------------------ // Constructs a new repeat enumerable object for the repeat operation. // internal RepeatEnumerable(TResult element, int count) : base(QuerySettings.Empty) { Contract.Assert(count >= 0, "count not within range (must be >= 0)"); m_element = element; m_count = count; } //----------------------------------------------------------------------------------- // Retrieves 'count' partitions, dividing the total count by the partition count, // and having each partition produce a certain number of repeated elements. // public QueryOperatorEnumerator [] GetPartitions(int partitionCount) { // Calculate a stride size. int stride = (m_count + partitionCount - 1) / partitionCount; // Now generate the actual enumerators. Each produces 'stride' elements, except // for the last partition which may produce fewer (if 'm_count' isn't evenly // divisible by 'partitionCount'). QueryOperatorEnumerator [] partitions = new QueryOperatorEnumerator [partitionCount]; for (int i = 0, offset = 0; i < partitionCount; i++, offset += stride) { if ((offset + stride) > m_count) { partitions[i] = new RepeatEnumerator(m_element, offset < m_count ? m_count - offset : 0, offset); } else { partitions[i] = new RepeatEnumerator(m_element, stride, offset); } } return partitions; } //----------------------------------------------------------------------------------- // Basic IEnumerator method implementations. // public override IEnumerator GetEnumerator() { return new RepeatEnumerator(m_element, m_count, 0).AsClassicEnumerator(); } //----------------------------------------------------------------------------------- // The actual enumerator that produces a set of repeated elements. // class RepeatEnumerator : QueryOperatorEnumerator { private readonly TResult m_element; // The element to repeat. private readonly int m_count; // The number of times to repeat it. private readonly int m_indexOffset; // Our index offset. private Shared m_currentIndex; // The number of times we have already repeated it. [allocate in moveNext to avoid false-sharing] //------------------------------------------------------------------------------------ // Creates a new enumerator. // internal RepeatEnumerator(TResult element, int count, int indexOffset) { m_element = element; m_count = count; m_indexOffset = indexOffset; } //----------------------------------------------------------------------------------- // Basic IEnumerator methods. These produce the repeating sequence.. // internal override bool MoveNext(ref TResult currentElement, ref int currentKey) { if( m_currentIndex == null) m_currentIndex = new Shared (-1); if (m_currentIndex.Value < (m_count - 1)) { ++m_currentIndex.Value; currentElement = m_element; currentKey = m_currentIndex.Value + m_indexOffset; return true; } return false; } internal override void Reset() { m_currentIndex = null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // RepeatEnumerable.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Diagnostics.Contracts; namespace System.Linq.Parallel { ////// A simple enumerable type that implements the repeat algorithm. It also supports /// partitioning of the count space by implementing an interface that PLINQ recognizes. /// ///internal class RepeatEnumerable : ParallelQuery , IParallelPartitionable { private TResult m_element; // Element value to repeat. private int m_count; // Count of element values. //------------------------------------------------------------------------------------ // Constructs a new repeat enumerable object for the repeat operation. // internal RepeatEnumerable(TResult element, int count) : base(QuerySettings.Empty) { Contract.Assert(count >= 0, "count not within range (must be >= 0)"); m_element = element; m_count = count; } //----------------------------------------------------------------------------------- // Retrieves 'count' partitions, dividing the total count by the partition count, // and having each partition produce a certain number of repeated elements. // public QueryOperatorEnumerator [] GetPartitions(int partitionCount) { // Calculate a stride size. int stride = (m_count + partitionCount - 1) / partitionCount; // Now generate the actual enumerators. Each produces 'stride' elements, except // for the last partition which may produce fewer (if 'm_count' isn't evenly // divisible by 'partitionCount'). QueryOperatorEnumerator [] partitions = new QueryOperatorEnumerator [partitionCount]; for (int i = 0, offset = 0; i < partitionCount; i++, offset += stride) { if ((offset + stride) > m_count) { partitions[i] = new RepeatEnumerator(m_element, offset < m_count ? m_count - offset : 0, offset); } else { partitions[i] = new RepeatEnumerator(m_element, stride, offset); } } return partitions; } //----------------------------------------------------------------------------------- // Basic IEnumerator method implementations. // public override IEnumerator GetEnumerator() { return new RepeatEnumerator(m_element, m_count, 0).AsClassicEnumerator(); } //----------------------------------------------------------------------------------- // The actual enumerator that produces a set of repeated elements. // class RepeatEnumerator : QueryOperatorEnumerator { private readonly TResult m_element; // The element to repeat. private readonly int m_count; // The number of times to repeat it. private readonly int m_indexOffset; // Our index offset. private Shared m_currentIndex; // The number of times we have already repeated it. [allocate in moveNext to avoid false-sharing] //------------------------------------------------------------------------------------ // Creates a new enumerator. // internal RepeatEnumerator(TResult element, int count, int indexOffset) { m_element = element; m_count = count; m_indexOffset = indexOffset; } //----------------------------------------------------------------------------------- // Basic IEnumerator methods. These produce the repeating sequence.. // internal override bool MoveNext(ref TResult currentElement, ref int currentKey) { if( m_currentIndex == null) m_currentIndex = new Shared (-1); if (m_currentIndex.Value < (m_count - 1)) { ++m_currentIndex.Value; currentElement = m_element; currentKey = m_currentIndex.Value + m_indexOffset; return true; } return false; } internal override void Reset() { m_currentIndex = null; } } } } // 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
- SetterBaseCollection.cs
- FontDialog.cs
- SrgsRulesCollection.cs
- UndoManager.cs
- DocumentPageViewAutomationPeer.cs
- SharedStatics.cs
- SoapSchemaImporter.cs
- TextServicesDisplayAttribute.cs
- StreamInfo.cs
- EnvironmentPermission.cs
- AuthenticationServiceManager.cs
- SystemParameters.cs
- HostProtectionException.cs
- OdbcReferenceCollection.cs
- StylusPointPropertyId.cs
- ResourceExpressionBuilder.cs
- CriticalExceptions.cs
- DataGridViewCellFormattingEventArgs.cs
- InlinedAggregationOperator.cs
- TransformCollection.cs
- SrgsElement.cs
- EventMappingSettingsCollection.cs
- XmlFormatReaderGenerator.cs
- RegistrySecurity.cs
- TemplateControlBuildProvider.cs
- DiscoveryClientBindingElement.cs
- RtfToXamlReader.cs
- SiteMapHierarchicalDataSourceView.cs
- BorderGapMaskConverter.cs
- DataServiceQueryException.cs
- ActivityExecutionContextCollection.cs
- DynamicMethod.cs
- DataGridViewRowPrePaintEventArgs.cs
- TakeOrSkipQueryOperator.cs
- OneWayElement.cs
- ImmutableAssemblyCacheEntry.cs
- AuthorizationRule.cs
- Grid.cs
- ExecutionContext.cs
- CryptoConfig.cs
- KnownTypesProvider.cs
- WorkflowFormatterBehavior.cs
- GradientStop.cs
- BufferedStream2.cs
- SqlClientMetaDataCollectionNames.cs
- ModelPerspective.cs
- Avt.cs
- ProviderUtil.cs
- DownloadProgressEventArgs.cs
- CodeCommentStatementCollection.cs
- ActivityBindForm.cs
- MD5CryptoServiceProvider.cs
- URLIdentityPermission.cs
- CopyAction.cs
- WinEventWrap.cs
- XmlAnyAttributeAttribute.cs
- FontWeight.cs
- SQLResource.cs
- StringFormat.cs
- ClientConfigurationHost.cs
- DashStyle.cs
- CheckPair.cs
- OperationCanceledException.cs
- SourceItem.cs
- SqlConnectionStringBuilder.cs
- HGlobalSafeHandle.cs
- AlgoModule.cs
- ResetableIterator.cs
- SignerInfo.cs
- CodeValidator.cs
- DocumentGrid.cs
- TabControlCancelEvent.cs
- HtmlTextArea.cs
- ReadonlyMessageFilter.cs
- MarkupCompilePass1.cs
- LayoutDump.cs
- SettingsBindableAttribute.cs
- MulticastOption.cs
- CopyNamespacesAction.cs
- XmlSchemaAttribute.cs
- Activity.cs
- CustomCredentialPolicy.cs
- CalendarDay.cs
- BindingCollection.cs
- ActivityCodeDomSerializer.cs
- FontStretch.cs
- EntityDataSourceWrapperCollection.cs
- SafeWaitHandle.cs
- CatalogZoneBase.cs
- ConsoleTraceListener.cs
- BamlReader.cs
- Material.cs
- ContourSegment.cs
- ExpressionBinding.cs
- EncryptedType.cs
- ColorMap.cs
- GridViewDeletedEventArgs.cs
- DetailsViewInsertedEventArgs.cs
- Highlights.cs
- DataTableTypeConverter.cs