64 lines
1.7 KiB
C++
64 lines
1.7 KiB
C++
#ifndef ALSK_ALSK_SKELETON_BONE_WHILE_H
|
|
#define ALSK_ALSK_SKELETON_BONE_WHILE_H
|
|
|
|
#include "../bonebase.h"
|
|
|
|
namespace alsk {
|
|
|
|
template<typename, typename, typename> struct While;
|
|
|
|
template<
|
|
typename Signature,
|
|
typename Test_, typename TestLinks_,
|
|
typename Task_, typename TaskLinks_
|
|
>
|
|
struct While<Signature, tmp::Pack<Test_, TestLinks_>, tmp::Pack<Task_, TaskLinks_>>: SkeletonBase {
|
|
using Test = Test_;
|
|
using TestLinks = TestLinks_;
|
|
|
|
using Task = Task_;
|
|
using TaskLinks = TaskLinks_;
|
|
|
|
using Links = tmp::Pack<TestLinks_, TaskLinks_>;
|
|
using PackP = tmp::Parameters<Signature>;
|
|
using PackR = Returns<Links>;
|
|
using PackX = tmp::Pack<>;
|
|
using Packs = arg::Placeholders<PackP, PackR, PackX>;
|
|
|
|
Test test;
|
|
Task task;
|
|
|
|
~While() noexcept {}; // -Winline
|
|
};
|
|
|
|
template<>
|
|
struct SkeletonTraits<While> {
|
|
static constexpr bool serial = true;
|
|
|
|
template<typename Skeleton, typename F, typename T>
|
|
static constexpr decltype(auto) traverse(std::size_t parDepth, Skeleton&& skeleton, F&& function, T&& init) {
|
|
using TraverserTest = SkeletonTraversal<typename std::decay_t<Skeleton>::Test>;
|
|
using TraverserTask = SkeletonTraversal<typename std::decay_t<Skeleton>::Task>;
|
|
return function(parDepth,
|
|
skeleton,
|
|
TraverserTest::execute(parDepth, skeleton.task, function, std::forward<T>(init)),
|
|
TraverserTask::execute(parDepth, skeleton.task, function, std::forward<T>(init))
|
|
);
|
|
}
|
|
|
|
template<typename Skeleton>
|
|
static constexpr std::size_t parallelizability(Skeleton&&) noexcept {
|
|
return 1;
|
|
}
|
|
};
|
|
|
|
template<typename... Args, typename F>
|
|
void skeletonTraversal(While<Args...> const& s, F f) {
|
|
f(s.test, 1);
|
|
f(s.task, 1);
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|