package Salsa.Core;
public final class BlockPartitioner {
public static Block[][] Partition(int rowCount, int columnCount, int numRowBlocks, int numColumnBlocks) {
return Partition(0, 0, rowCount, columnCount, numRowBlocks, numColumnBlocks);
}
public static Block[][] Partition(int rowStartIndex, int columnStartIndex, int rowCount, int columnCount, int numRowBlocks, int numColumnBlocks) {
Range[] rowRanges = RangePartitioner.Partition(rowStartIndex, rowCount, numRowBlocks);
Range[] colRanges = RangePartitioner.Partition(columnStartIndex, columnCount, numColumnBlocks);
Block[][] result = new Block[numRowBlocks][];
for (int i = 0; i < rowRanges.length; i++) {
result[i] = new Block[numColumnBlocks];
for (int j = 0; j < colRanges.length; j++) {
result[i][j] = new Block(rowRanges[i], colRanges[j]);
}
}
return result;
}
public static Block[][] PartitionByLength(int rowCount, int columnCount, int maxRowPartitionLength, int maxColumnPartitionLength) {
return PartitionByLength(0, 0, rowCount, columnCount, maxRowPartitionLength, maxColumnPartitionLength);
}
public static Block[][] PartitionByLength(int rowStartIndex, int columnStartIndex, int rowCount, int columnCount, int maxRowPartitionLength, int maxColumnPartitionLength) {
Range[] rowRanges = RangePartitioner.PartitionByLength(rowStartIndex, rowCount, maxRowPartitionLength);
Range[] colRanges = RangePartitioner.PartitionByLength(columnStartIndex, columnCount, maxColumnPartitionLength);
Block[][] result = new Block[rowRanges.length][];
for (int i = 0; i < rowRanges.length; i++) {
result[i] = new Block[colRanges.length];
for (int j = 0; j < colRanges.length; j++) {
result[i][j] = new Block(rowRanges[i], colRanges[j]);
}
}
return result;
}
}