// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
+#if NET_4_0
+
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
-
-#if NET_4_0
+using System.Collections.Concurrent.Partitioners;
namespace System.Linq.Parallel
{
System.Linq.Parallel/QueryCheckerVisitor.cs
System.Linq.Parallel/QueryIsOrderedVisitor.cs
System.Linq.Parallel/QueryOptions.cs
-../corlib/System.Collections.Concurrent/Partitioners/EnumerablePartitioner.cs
+../corlib/System.Collections.Concurrent.Partitioners/EnumerablePartitioner.cs
../corlib/System.Collections.Concurrent/ConcurrentSkipList.cs
../corlib/System.Threading/AtomicBoolean.cs
--- /dev/null
+2010-04-15 Jérémie Laval <jeremie.laval@gmail.com>
+
+ * ListPartitioner.cs: Remove playground code
+
+2010-04-15 Jérémie Laval <jeremie.laval@gmail.com>
+
+ * ListPartitioner.cs:
+ * EnumerablePartitioner.cs: Add internal behavior specific to PLinq
--- /dev/null
+//
+// EnumerablePartitioner.cs
+//
+// Author:
+// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
+//
+// Copyright (c) 2009 Jérémie "Garuma" Laval
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+#if NET_4_0 || BOOTSTRAP_NET_4_0
+
+using System;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+namespace System.Collections.Concurrent.Partitioners
+{
+ // Represent a chunk partitioner
+ internal class EnumerablePartitioner<T> : OrderablePartitioner<T>
+ {
+ IEnumerable<T> source;
+
+ const int InitialPartitionSize = 1;
+ const int PartitionMultiplier = 2;
+
+ int initialPartitionSize;
+ int partitionMultiplier;
+
+ int index = 0;
+ readonly object syncLock = new object ();
+
+ public EnumerablePartitioner (IEnumerable<T> source)
+ : this (source, InitialPartitionSize, PartitionMultiplier)
+ {
+
+ }
+
+ // This is used to get striped partitionning (for Take and Skip for instance
+ public EnumerablePartitioner (IEnumerable<T> source, int initialPartitionSize, int partitionMultiplier)
+ : base (true, false, true)
+ {
+ this.source = source;
+ this.initialPartitionSize = initialPartitionSize;
+ this.partitionMultiplier = partitionMultiplier;
+ }
+
+ public override IList<IEnumerator<KeyValuePair<long, T>>> GetOrderablePartitions (int partitionCount)
+ {
+ if (partitionCount <= 0)
+ throw new ArgumentOutOfRangeException ("partitionCount");
+
+ IEnumerator<KeyValuePair<long, T>>[] enumerators
+ = new IEnumerator<KeyValuePair<long, T>>[partitionCount];
+
+ IEnumerator<T> src = source.GetEnumerator ();
+
+ for (int i = 0; i < enumerators.Length; i++) {
+ enumerators[i] = GetPartitionEnumerator (src);
+ }
+
+ return enumerators;
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetPartitionEnumerator (IEnumerator<T> src)
+ {
+ int count = initialPartitionSize;
+ List<T> list = new List<T> ();
+
+ while (true) {
+ list.Clear ();
+ int ind = -1;
+
+ lock (syncLock) {
+ ind = index;
+
+ for (int i = 0; i < count; i++) {
+ if (!src.MoveNext ()) {
+ if (list.Count == 0)
+ yield break;
+ else
+ break;
+ }
+
+ list.Add (src.Current);
+ index++;
+ }
+ }
+
+
+
+ for (int i = 0; i < list.Count; i++)
+ yield return new KeyValuePair<long, T> (ind + i, list[i]);
+
+ count *= partitionMultiplier;
+ }
+ }
+ }
+}
+#endif
--- /dev/null
+//
+// ListPartitioner.cs
+//
+// Author:
+// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
+//
+// Copyright (c) 2009 Jérémie "Garuma" Laval
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+#if NET_4_0 || BOOTSTRAP_NET_4_0
+
+namespace System.Collections.Concurrent.Partitioners
+{
+ // Represent a Range partitioner
+ internal class ListPartitioner<T> : OrderablePartitioner<T>
+ {
+ IList<T> source;
+ readonly bool chunking = Environment.GetEnvironmentVariable ("PLINQ_PARTITIONING_HINT") == "chunking";
+
+ public ListPartitioner (IList<T> source) : base (true, true, true)
+ {
+ this.source = source;
+ }
+
+ public override IList<IEnumerator<KeyValuePair<long, T>>> GetOrderablePartitions (int partitionCount)
+ {
+ if (partitionCount <= 0)
+ throw new ArgumentOutOfRangeException ("partitionCount");
+
+ IEnumerator<KeyValuePair<long, T>>[] enumerators
+ = new IEnumerator<KeyValuePair<long, T>>[partitionCount];
+
+ int count = source.Count / partitionCount;
+ if (count <= 1)
+ count = 1;
+
+ for (int i = 0; i < enumerators.Length; i++) {
+ if (chunking) {
+ const int step = 64;
+ enumerators[i] = GetEnumeratorForRange (i * step, enumerators.Length, source.Count, step);
+ continue;
+ }
+
+ if (i != enumerators.Length - 1)
+ enumerators[i] = GetEnumeratorForRange (i * count, i * count + count);
+ else
+ enumerators[i] = GetEnumeratorForRange (i * count, source.Count);
+ }
+
+ return enumerators;
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRange (int startIndex, int lastIndex)
+ {
+ if (startIndex >= source.Count)
+ return GetEmpty ();
+
+ return GetEnumeratorForRangeInternal (startIndex, lastIndex);
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRange (int startIndex, int stride, int count, int step)
+ {
+ if (startIndex >= source.Count)
+ return GetEmpty ();
+
+ return GetEnumeratorForRangeInternal (startIndex, stride, count, step);
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetEmpty ()
+ {
+ yield break;
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRangeInternal (int startIndex, int lastIndex)
+ {
+ for (int i = startIndex; i < lastIndex; i++) {
+ yield return new KeyValuePair<long, T> (i, source[i]);
+ }
+ }
+
+ IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRangeInternal (int startIndex, int stride, int count, int step)
+ {
+ for (int i = startIndex; i < count; i += stride * step) {
+ for (int j = i; j < i + step && j < count; j++) {
+ yield return new KeyValuePair<long, T> (j, source[j]);
+ }
+ }
+ }
+ }
+}
+#endif
--- /dev/null
+//
+// UserRangePartitioner.cs
+//
+// Author:
+// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
+//
+// Copyright (c) 2010 Jérémie "Garuma" Laval
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+#if NET_4_0 || BOOTSTRAP_NET_4_0
+
+namespace System.Collections.Concurrent.Partitioners
+{
+ internal class UserRangePartitioner : OrderablePartitioner<Tuple<int, int>>
+ {
+ readonly int start;
+ readonly int end;
+ readonly int rangeSize;
+
+ public UserRangePartitioner (int start, int end, int rangeSize) : base (true, true, true)
+ {
+ this.start = start;
+ this.end = end;
+ this.rangeSize = rangeSize;
+ }
+
+ public override IList<IEnumerator<KeyValuePair<long, Tuple<int, int>>>> GetOrderablePartitions (int partitionCount)
+ {
+ if (partitionCount <= 0)
+ throw new ArgumentOutOfRangeException ("partitionCount");
+
+ var enumerators = new IEnumerator<KeyValuePair<long, Tuple<int, int>>>[partitionCount];
+ for (int i = 1; i < partitionCount; i++)
+ enumerators[i] = GetEmpty ();
+
+ enumerators[0] = GetEnumerator ();
+
+ return enumerators;
+ }
+
+ IEnumerator<KeyValuePair<long, Tuple<int, int>>> GetEnumerator ()
+ {
+ int sliceStart = start;
+ long index = -1;
+
+ while (sliceStart <= end) {
+ yield return new KeyValuePair<long, Tuple<int, int>> (++index, Tuple.Create (sliceStart, Math.Min (end, sliceStart + rangeSize)));
+ sliceStart += rangeSize;
+ }
+ }
+
+ IEnumerator<KeyValuePair<long, Tuple<int, int>>> GetEmpty ()
+ {
+ yield break;
+ }
+ }
+
+ internal class UserLongRangePartitioner : OrderablePartitioner<Tuple<long, long>>
+ {
+ readonly long start;
+ readonly long end;
+ readonly long rangeSize;
+
+ public UserLongRangePartitioner (long start, long end, long rangeSize) : base (true, true, true)
+ {
+ this.start = start;
+ this.end = end;
+ this.rangeSize = rangeSize;
+ }
+
+ public override IList<IEnumerator<KeyValuePair<long, Tuple<long, long>>>> GetOrderablePartitions (int partitionCount)
+ {
+ if (partitionCount <= 0)
+ throw new ArgumentOutOfRangeException ("partitionCount");
+
+ var enumerators = new IEnumerator<KeyValuePair<long, Tuple<long, long>>>[partitionCount];
+ for (int i = 1; i < partitionCount; i++)
+ enumerators[i] = GetEmpty ();
+
+ enumerators[0] = GetEnumerator ();
+
+ return enumerators;
+ }
+
+ IEnumerator<KeyValuePair<long, Tuple<long, long>>> GetEnumerator ()
+ {
+ long sliceStart = start;
+ long index = -1;
+
+ while (sliceStart <= end) {
+ yield return new KeyValuePair<long, Tuple<long, long>> (++index, Tuple.Create (sliceStart, Math.Min (end, sliceStart + rangeSize)));
+ sliceStart += rangeSize;
+ }
+ }
+
+ IEnumerator<KeyValuePair<long, Tuple<long, long>>> GetEmpty ()
+ {
+ yield break;
+ }
+ }
+
+}
+#endif
namespace System.Collections.Concurrent
{
+ using Partitioners;
+
public static class Partitioner
{
public static OrderablePartitioner<TSource> Create<TSource> (IEnumerable<TSource> source)
+++ /dev/null
-2010-04-15 Jérémie Laval <jeremie.laval@gmail.com>
-
- * ListPartitioner.cs: Remove playground code
-
-2010-04-15 Jérémie Laval <jeremie.laval@gmail.com>
-
- * ListPartitioner.cs:
- * EnumerablePartitioner.cs: Add internal behavior specific to PLinq
+++ /dev/null
-//
-// EnumerablePartitioner.cs
-//
-// Author:
-// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
-//
-// Copyright (c) 2009 Jérémie "Garuma" Laval
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-#if NET_4_0 || BOOTSTRAP_NET_4_0
-
-using System;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-
-namespace System.Collections.Concurrent
-{
- // Represent a chunk partitioner
- internal class EnumerablePartitioner<T> : OrderablePartitioner<T>
- {
- IEnumerable<T> source;
-
- const int InitialPartitionSize = 1;
- const int PartitionMultiplier = 2;
-
- int initialPartitionSize;
- int partitionMultiplier;
-
- int index = 0;
- readonly object syncLock = new object ();
-
- public EnumerablePartitioner (IEnumerable<T> source)
- : this (source, InitialPartitionSize, PartitionMultiplier)
- {
-
- }
-
- // This is used to get striped partitionning (for Take and Skip for instance
- public EnumerablePartitioner (IEnumerable<T> source, int initialPartitionSize, int partitionMultiplier)
- : base (true, false, true)
- {
- this.source = source;
- this.initialPartitionSize = initialPartitionSize;
- this.partitionMultiplier = partitionMultiplier;
- }
-
- public override IList<IEnumerator<KeyValuePair<long, T>>> GetOrderablePartitions (int partitionCount)
- {
- if (partitionCount <= 0)
- throw new ArgumentOutOfRangeException ("partitionCount");
-
- IEnumerator<KeyValuePair<long, T>>[] enumerators
- = new IEnumerator<KeyValuePair<long, T>>[partitionCount];
-
- IEnumerator<T> src = source.GetEnumerator ();
-
- for (int i = 0; i < enumerators.Length; i++) {
- enumerators[i] = GetPartitionEnumerator (src);
- }
-
- return enumerators;
- }
-
- IEnumerator<KeyValuePair<long, T>> GetPartitionEnumerator (IEnumerator<T> src)
- {
- int count = initialPartitionSize;
- List<T> list = new List<T> ();
-
- while (true) {
- list.Clear ();
- int ind = -1;
-
- lock (syncLock) {
- ind = index;
-
- for (int i = 0; i < count; i++) {
- if (!src.MoveNext ()) {
- if (list.Count == 0)
- yield break;
- else
- break;
- }
-
- list.Add (src.Current);
- index++;
- }
- }
-
-
-
- for (int i = 0; i < list.Count; i++)
- yield return new KeyValuePair<long, T> (ind + i, list[i]);
-
- count *= partitionMultiplier;
- }
- }
- }
-}
-#endif
+++ /dev/null
-//
-// ListPartitioner.cs
-//
-// Author:
-// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
-//
-// Copyright (c) 2009 Jérémie "Garuma" Laval
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-#if NET_4_0 || BOOTSTRAP_NET_4_0
-
-namespace System.Collections.Concurrent
-{
- // Represent a Range partitioner
- internal class ListPartitioner<T> : OrderablePartitioner<T>
- {
- IList<T> source;
- readonly bool chunking = Environment.GetEnvironmentVariable ("PLINQ_PARTITIONING_HINT") == "chunking";
-
- public ListPartitioner (IList<T> source) : base (true, true, true)
- {
- this.source = source;
- }
-
- public override IList<IEnumerator<KeyValuePair<long, T>>> GetOrderablePartitions (int partitionCount)
- {
- if (partitionCount <= 0)
- throw new ArgumentOutOfRangeException ("partitionCount");
-
- IEnumerator<KeyValuePair<long, T>>[] enumerators
- = new IEnumerator<KeyValuePair<long, T>>[partitionCount];
-
- int count = source.Count / partitionCount;
- if (count <= 1)
- count = 1;
-
- for (int i = 0; i < enumerators.Length; i++) {
- if (chunking) {
- const int step = 64;
- enumerators[i] = GetEnumeratorForRange (i * step, enumerators.Length, source.Count, step);
- continue;
- }
-
- if (i != enumerators.Length - 1)
- enumerators[i] = GetEnumeratorForRange (i * count, i * count + count);
- else
- enumerators[i] = GetEnumeratorForRange (i * count, source.Count);
- }
-
- return enumerators;
- }
-
- IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRange (int startIndex, int lastIndex)
- {
- if (startIndex >= source.Count)
- return GetEmpty ();
-
- return GetEnumeratorForRangeInternal (startIndex, lastIndex);
- }
-
- IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRange (int startIndex, int stride, int count, int step)
- {
- if (startIndex >= source.Count)
- return GetEmpty ();
-
- return GetEnumeratorForRangeInternal (startIndex, stride, count, step);
- }
-
- IEnumerator<KeyValuePair<long, T>> GetEmpty ()
- {
- yield break;
- }
-
- IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRangeInternal (int startIndex, int lastIndex)
- {
- for (int i = startIndex; i < lastIndex; i++) {
- yield return new KeyValuePair<long, T> (i, source[i]);
- }
- }
-
- IEnumerator<KeyValuePair<long, T>> GetEnumeratorForRangeInternal (int startIndex, int stride, int count, int step)
- {
- for (int i = startIndex; i < count; i += stride * step) {
- for (int j = i; j < i + step && j < count; j++) {
- yield return new KeyValuePair<long, T> (j, source[j]);
- }
- }
- }
- }
-}
-#endif
+++ /dev/null
-//
-// UserRangePartitioner.cs
-//
-// Author:
-// Jérémie "Garuma" Laval <jeremie.laval@gmail.com>
-//
-// Copyright (c) 2010 Jérémie "Garuma" Laval
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-#if NET_4_0 || BOOTSTRAP_NET_4_0
-
-namespace System.Collections.Concurrent
-{
- internal class UserRangePartitioner : OrderablePartitioner<Tuple<int, int>>
- {
- readonly int start;
- readonly int end;
- readonly int rangeSize;
-
- public UserRangePartitioner (int start, int end, int rangeSize) : base (true, true, true)
- {
- this.start = start;
- this.end = end;
- this.rangeSize = rangeSize;
- }
-
- public override IList<IEnumerator<KeyValuePair<long, Tuple<int, int>>>> GetOrderablePartitions (int partitionCount)
- {
- if (partitionCount <= 0)
- throw new ArgumentOutOfRangeException ("partitionCount");
-
- var enumerators = new IEnumerator<KeyValuePair<long, Tuple<int, int>>>[partitionCount];
- for (int i = 1; i < partitionCount; i++)
- enumerators[i] = GetEmpty ();
-
- enumerators[0] = GetEnumerator ();
-
- return enumerators;
- }
-
- IEnumerator<KeyValuePair<long, Tuple<int, int>>> GetEnumerator ()
- {
- int sliceStart = start;
- long index = -1;
-
- while (sliceStart <= end) {
- yield return new KeyValuePair<long, Tuple<int, int>> (++index, Tuple.Create (sliceStart, Math.Min (end, sliceStart + rangeSize)));
- sliceStart += rangeSize;
- }
- }
-
- IEnumerator<KeyValuePair<long, Tuple<int, int>>> GetEmpty ()
- {
- yield break;
- }
- }
-
- internal class UserLongRangePartitioner : OrderablePartitioner<Tuple<long, long>>
- {
- readonly long start;
- readonly long end;
- readonly long rangeSize;
-
- public UserLongRangePartitioner (long start, long end, long rangeSize) : base (true, true, true)
- {
- this.start = start;
- this.end = end;
- this.rangeSize = rangeSize;
- }
-
- public override IList<IEnumerator<KeyValuePair<long, Tuple<long, long>>>> GetOrderablePartitions (int partitionCount)
- {
- if (partitionCount <= 0)
- throw new ArgumentOutOfRangeException ("partitionCount");
-
- var enumerators = new IEnumerator<KeyValuePair<long, Tuple<long, long>>>[partitionCount];
- for (int i = 1; i < partitionCount; i++)
- enumerators[i] = GetEmpty ();
-
- enumerators[0] = GetEnumerator ();
-
- return enumerators;
- }
-
- IEnumerator<KeyValuePair<long, Tuple<long, long>>> GetEnumerator ()
- {
- long sliceStart = start;
- long index = -1;
-
- while (sliceStart <= end) {
- yield return new KeyValuePair<long, Tuple<long, long>> (++index, Tuple.Create (sliceStart, Math.Min (end, sliceStart + rangeSize)));
- sliceStart += rangeSize;
- }
- }
-
- IEnumerator<KeyValuePair<long, Tuple<long, long>>> GetEmpty ()
- {
- yield break;
- }
- }
-
-}
-#endif
System.Collections.Concurrent/Partitioner.cs
System.Collections.Concurrent/ConcurrentQueue.cs
System.Collections.Concurrent/ConcurrentSkipList.cs
-System.Collections.Concurrent/Partitioners/ListPartitioner.cs
-System.Collections.Concurrent/Partitioners/EnumerablePartitioner.cs
-System.Collections.Concurrent/Partitioners/UserRangePartitioner.cs
+System.Collections.Concurrent.Partitioners/ListPartitioner.cs
+System.Collections.Concurrent.Partitioners/EnumerablePartitioner.cs
+System.Collections.Concurrent.Partitioners/UserRangePartitioner.cs
System.Collections.Concurrent/IProducerConsumerCollection.cs
System.Collections.Concurrent/ConcurrentStack.cs
System.Collections.Concurrent/SplitOrderedList.cs