package org.simpleflatmapper.reflect.asm;
public class ShardingHelper {
public static void shard(int nb, int maxSize, ShardCallBack callBack) {
if (nb == 0) {
callBack.leafDispatch("", 0, 0);
} else if (nb <= maxSize) {
callBack.leafDispatch("", 0, nb);
} else {
int currentSize = nb;
int currentDivider = 1;
boolean root = false;
while(!root) {
int nextSize = currentSize /maxSize;
root = (nb - nextSize * (currentDivider * maxSize)) == 0 ? nextSize <= 1 : nextSize <= 0;
int i = 0;
do {
int pEnd = i + (currentDivider * maxSize);
int end = Math.min(nb, pEnd);
if (currentSize == nb) {
callBack.leafDispatch(currentDivider + "n" + i + "t" + end, i, end);
} else if (root) {
callBack.nodeDispatch("", currentDivider, i, end);
} else {
callBack.nodeDispatch(currentDivider + "n" + i + "t" + end, currentDivider, i, end);
}
i += (currentDivider * maxSize);
} while( i < nb);
currentDivider = currentDivider * maxSize;
currentSize = nextSize;
}
}
}
public interface ShardCallBack {
void leafDispatch(String suffix, int start, int end);
void nodeDispatch(String suffix, int divide, int start, int end);
}
}