1/*******************************************************************************
2 Copyright (c) The Taichi Authors (2016- ). All Rights Reserved.
3 The use of this software is governed by the LICENSE file.
4*******************************************************************************/
5
6#pragma once
7
8#include <vector>
9#include <string>
10
11#include "taichi/common/interface.h"
12
13namespace taichi {
14
15class Task : public Unit {
16 public:
17 virtual std::string run(const std::vector<std::string> &parameters) {
18 TI_ASSERT_INFO(parameters.size() == 0, "No parameters supported.");
19 return this->run();
20 }
21
22 virtual std::string run() {
23 return this->run(std::vector<std::string>());
24 }
25
26 ~Task() override {
27 }
28};
29
30TI_INTERFACE(Task)
31
32template <typename T>
33inline std::enable_if_t<
34 std::is_same<std::result_of_t<T(const std::vector<std::string> &)>,
35 void>::value ||
36 std::is_same<std::result_of_t<T(const std::vector<std::string> &)>,
37 const char *>::value,
38 std::string>
39task_invoke(const T &func, const std::vector<std::string> &params) {
40 func(params);
41 return "";
42}
43
44template <typename T>
45inline std::enable_if_t<
46 std::is_same<std::result_of_t<T(const std::vector<std::string> &)>,
47 std::string>::value,
48 std::string>
49task_invoke(const T &func, const std::vector<std::string> &params) {
50 return func(params);
51}
52
53template <typename T>
54inline std::enable_if_t<std::is_same<std::result_of_t<T()>, void>::value,
55 std::string>
56task_invoke(const T &func, const std::vector<std::string> &params) {
57 func();
58 return "";
59}
60
61template <typename T>
62inline std::enable_if_t<
63 std::is_same<std::result_of_t<T()>, std::string>::value ||
64 std::is_same<std::result_of_t<T()>, const char *>::value,
65 std::string>
66task_invoke(const T &func, const std::vector<std::string> &params) {
67 return func();
68}
69
70#define TI_REGISTER_TASK(task) \
71 class Task_##task : public taichi::Task { \
72 std::string run(const std::vector<std::string> &parameters) override { \
73 return taichi::task_invoke<decltype(task)>(task, parameters); \
74 } \
75 }; \
76 TI_IMPLEMENTATION(Task, Task_##task, #task)
77
78} // namespace taichi
79