
#ifndef PLS_PARALLEL_FOR_H
#define PLS_PARALLEL_FOR_H

#include "pls/internal/scheduling/parallel_result.h"

namespace pls {
namespace algorithm {

class fixed_strategy;
class dynamic_strategy;

template<typename Function, typename ExecutionStrategy>
pls::internal::scheduling::parallel_result<int> for_each_range(unsigned long first,
                                                               unsigned long last,
                                                               const Function &function,
                                                               ExecutionStrategy &execution_strategy);

template<typename Function>
pls::internal::scheduling::parallel_result<int> for_each_range(unsigned long first,
                                                               unsigned long last,
                                                               const Function &function);

template<typename RandomIt, typename Function, typename ExecutionStrategy>
pls::internal::scheduling::parallel_result<int> for_each(RandomIt first,
                                                         RandomIt last,
                                                         const Function &function,
                                                         ExecutionStrategy execution_strategy);

template<typename RandomIt, typename Function>
pls::internal::scheduling::parallel_result<int> for_each(RandomIt first,
                                                         RandomIt last,
                                                         const Function &function);

}
}
#include "for_each_impl.h"

#endif //PLS_PARALLEL_FOR_H
