package Salsa.Core;
public final class RangePartitioner64
{
public static Range64[] Partition(long length, long numPartitions)
{
return Partition(0, length, numPartitions);
}
public static Range64[] Partition(Range64 range, long numPartitions)
{
return Partition(range.StartIndex, range.getLength(), numPartitions);
}
public static Range64[] Partition(long startIndex, long length, long numPartitions)
{
if (numPartitions < 1)
{
throw new IllegalArgumentException("count Partitioning requires numPartitions to be greater than zero.");
}
if (length < 1)
{
throw new IllegalArgumentException("length Partitioning requires length to be greater than zero.");
}
if (length < numPartitions)
{
throw new UnsupportedOperationException("Partitioning cannot be performed when length is less than numPartitions requested.");
}
Range64[] ranges = new Range64[(int) numPartitions];
long chunksize = length / numPartitions;
long remainder = length % numPartitions;
for (int i = 0; i < numPartitions; i++)
{
if (remainder > 0)
{
ranges[i] = new Range64(startIndex, startIndex + chunksize);
startIndex += chunksize + 1;
remainder--;
}
else
{
ranges[i] = new Range64(startIndex, startIndex + chunksize - 1);
startIndex += chunksize;
}
}
return ranges;
}
public static Range64[] PartitionByLength(long length, long maxPartitionLength)
{
return PartitionByLength(0, length, maxPartitionLength);
}
public static Range64[] PartitionByLength(Range64 range, long maxPartitionLength)
{
return PartitionByLength(range.StartIndex, range.getLength(), maxPartitionLength);
}
public static Range64[] PartitionByLength(long startIndex, long length, long maxPartitionLength)
{
if (maxPartitionLength < 1)
{
throw new IllegalArgumentException("maxPartitionLength Partitioning requires the maxPartitionLength to be greater than zero.");
}
if (length < 1)
{
throw new IllegalArgumentException("length Partitioning requires the length to be greater than zero.");
}
if (length < maxPartitionLength)
{
throw new IllegalArgumentException("length Partitioning requires the length to be greater than maxPartitionLength.");
}
long rangeCount = length / maxPartitionLength;
long lastRangeLength = length % maxPartitionLength;
if (lastRangeLength > 0)
{
rangeCount++;
}
else
{
lastRangeLength = maxPartitionLength;
}
Range64[] ranges = new Range64[(int) rangeCount];
for (int i = 0; i < rangeCount; i++)
{
long start = i * maxPartitionLength;
long end = (i == rangeCount - 1 ? start + lastRangeLength - 1 : start + maxPartitionLength - 1);
ranges[i] = new Range64(start, end);
start += maxPartitionLength;
}
return ranges;
}
}