package org.eclipse.collections.impl.parallel;
import java.util.concurrent.Executor;
import org.eclipse.collections.api.block.procedure.Procedure;
import org.eclipse.collections.impl.utility.ArrayIterate;
import static org.eclipse.collections.impl.factory.Iterables.iList;
public final class ParallelArrayIterate
{
private ParallelArrayIterate()
{
throw new AssertionError("Suppress default constructor for noninstantiability");
}
public static <T, BT extends Procedure<? super T>> void forEach(
T[] array,
ProcedureFactory<BT> procedureFactory,
Combiner<BT> combiner)
{
int taskCount = Math.max(ParallelIterate.DEFAULT_PARALLEL_TASK_COUNT, array.length / ParallelIterate.DEFAULT_MIN_FORK_SIZE);
ParallelArrayIterate.forEach(array, procedureFactory, combiner, ParallelIterate.DEFAULT_MIN_FORK_SIZE, taskCount);
}
public static <T, BT extends Procedure<? super T>> void forEach(
T[] array,
ProcedureFactory<BT> procedureFactory,
Combiner<BT> combiner,
int minForkSize,
int taskCount)
{
ParallelArrayIterate.forEachOn(array, procedureFactory, combiner, minForkSize, taskCount, ParallelIterate.EXECUTOR_SERVICE);
}
public static <T, BT extends Procedure<? super T>> void forEachOn(
T[] array,
ProcedureFactory<BT> procedureFactory,
Combiner<BT> combiner,
int minForkSize,
int taskCount,
Executor executor)
{
if (ArrayIterate.notEmpty(array))
{
int size = array.length;
if (size < minForkSize)
{
BT procedure = procedureFactory.create();
ArrayIterate.forEach(array, procedure);
ParallelArrayIterate.combineSingleProcedure(combiner, procedure);
}
else
{
int threadCount = Math.min(size, taskCount);
new ArrayProcedureFJTaskRunner<>(combiner, threadCount).executeAndCombine(executor, procedureFactory, array);
}
}
}
private static <T, BT extends Procedure<? super T>> void combineSingleProcedure(Combiner<BT> combiner, BT procedure)
{
if (combiner.useCombineOne())
{
combiner.combineOne(procedure);
}
else
{
combiner.combineAll(iList(procedure));
}
}
}