rosa/inc/alsk/impl/bone/farm.h

76 lines
1.9 KiB
C
Raw Permalink Normal View History

2021-05-10 16:14:24 +00:00
#ifndef ALSK_ALSK_IMPL_BONE_FARM_H
#define ALSK_ALSK_IMPL_BONE_FARM_H
#include <cmath>
#include <thread>
#include <tuple>
#include <utility>
#include <vector>
#include "../boneimplbase.h"
#include "../../skeleton/bone/farm.h"
namespace alsk {
/**
* @brief Farm implementation for sequential execution
*/
template<typename R, typename... Args, typename TTask, typename Executor, typename State>
struct Impl<Farm<R(Args...), TTask>, tag::Sequential, Executor, State>:
BoneImplBase<Farm<R(Args...), TTask>, tag::Sequential, Executor, State>
{
using This = Impl;
using Task = Execute<typename This::Skeleton::TaskLinks>;
typename This::Skeleton skeleton;
typename This::Executor executor;
typename This::StateRef state;
constexpr Impl() = default;
template<typename S>
constexpr Impl(S&& skeleton, Executor executor, State& state):
skeleton{std::forward<S>(skeleton)},
executor{executor},
state{state}
{}
constexpr void operator()(Args... args) {
executor.template executeSequential<Task>(
*this, skeleton.task, std::forward_as_tuple(args...), skeleton.n
);
}
};
/**
* @brief Farm implementation for parallel execution
*/
template<typename R, typename... Args, typename TTask, typename Executor, typename State>
struct Impl<Farm<R(Args...), TTask>, tag::Parallel, Executor, State>:
BoneImplBase<Farm<R(Args...), TTask>, tag::Parallel, Executor, State>
{
using This = Impl;
using Task = Execute<typename This::Skeleton::TaskLinks>;
typename This::Skeleton skeleton;
typename This::Executor executor;
typename This::StateRef state;
constexpr Impl() = default;
template<typename S>
constexpr Impl(S&& skeleton, Executor executor, State& state):
skeleton{std::forward<S>(skeleton)},
executor{executor},
state{state}
{}
constexpr void operator()(Args... args) {
executor.template executeParallel<Task>(
*this, skeleton.task, std::forward_as_tuple(args...), skeleton.n
);
}
};
}
#endif