Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit da3b96a

Browse files
committed
c++17; map macro
1 parent 90af336 commit da3b96a

File tree

4 files changed

+50
-189
lines changed

4 files changed

+50
-189
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ find_package(Threads REQUIRED)
215215
# -----------------------------------------------------------------------------
216216

217217
add_library(${PROJECT_NAME} INTERFACE)
218-
target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14)
218+
target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17)
219219
target_link_libraries(${PROJECT_NAME} INTERFACE Threads::Threads)
220220
target_include_directories(${PROJECT_NAME} INTERFACE
221221
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>

taskflow/dsl/meta_macro.hpp

Lines changed: 30 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -1,176 +1,38 @@
11
// 2020/08/30 - Created by netcan: https://github.com/netcan
2+
// ref https://github.com/Erlkoenig90/map-macro/
23
#pragma once
3-
#ifdef _MSC_VER
4-
#define TF_EMPTY()
5-
#define TF_GET_ARG_COUNT_(...) \
6-
TF_PASTE(TF_GET_ARG_COUNT_I( \
7-
__VA_ARGS__, 120, 119, 118, \
8-
117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, \
9-
104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, \
10-
89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, \
11-
73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, \
12-
57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, \
13-
41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, \
14-
25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, \
15-
8, 7, 6, 5, 4, 3, 2, 1, 0, ), \
16-
TF_EMPTY())
4+
#define TF_EVAL0(...) __VA_ARGS__
5+
#define TF_EVAL1(...) TF_EVAL0(TF_EVAL0(TF_EVAL0(__VA_ARGS__)))
6+
#define TF_EVAL2(...) TF_EVAL1(TF_EVAL1(TF_EVAL1(__VA_ARGS__)))
7+
#define TF_EVAL3(...) TF_EVAL2(TF_EVAL2(TF_EVAL2(__VA_ARGS__)))
8+
#define TF_EVAL4(...) TF_EVAL3(TF_EVAL3(TF_EVAL3(__VA_ARGS__)))
9+
#define TF_EVAL5(...) TF_EVAL4(TF_EVAL4(TF_EVAL4(__VA_ARGS__)))
1710

11+
#ifdef _MSC_VER
12+
// MSVC needs more evaluations
13+
#define TF_EVAL6(...) TF_EVAL5(TF_EVAL5(TF_EVAL5(__VA_ARGS__)))
14+
#define TF_EVAL(...) TF_EVAL6(TF_EVAL6(__VA_ARGS__))
1815
#else
19-
#define TF_GET_ARG_COUNT_(...) \
20-
TF_GET_ARG_COUNT_I( \
21-
__VA_ARGS__, 120, 119, 118, 117, 116, \
22-
115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, \
23-
101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, \
24-
84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, \
25-
66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \
26-
48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, \
27-
30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, \
28-
12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, )
29-
16+
#define TF_EVAL(...) TF_EVAL5(__VA_ARGS__)
3017
#endif
3118

32-
#define TF_GET_ARG_COUNT(...) TF_GET_ARG_COUNT_(__dummy__, ##__VA_ARGS__)
33-
#define TF_GET_ARG_COUNT_I( \
34-
e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, \
35-
e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, \
36-
e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, \
37-
e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, \
38-
e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, \
39-
e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, \
40-
e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, \
41-
e105, e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, \
42-
e117, e118, e119, e120, size, \
43-
...) \
44-
size
19+
#define TF_MAP_END(...)
20+
#define TF_MAP_OUT
21+
22+
#define EMPTY()
23+
#define DEFER(id) id EMPTY()
24+
25+
#define TF_MAP_GET_END2() 0, TF_MAP_END
26+
#define TF_MAP_GET_END1(...) TF_MAP_GET_END2
27+
#define TF_MAP_GET_END(...) TF_MAP_GET_END1
28+
#define TF_MAP_NEXT0(test, next, ...) next TF_MAP_OUT
29+
#define TF_MAP_NEXT1(test, next) DEFER(TF_MAP_NEXT0)(test, next, 0)
30+
#define TF_MAP_NEXT(test, next) TF_MAP_NEXT1(TF_MAP_GET_END test, next)
4531

46-
#define TF_REPEAT_0(func, i, arg)
47-
#define TF_REPEAT_1(func, i, arg) func(i, arg)
48-
#define TF_REPEAT_2(func, i, arg, ...) \
49-
func(i, arg) TF_REPEAT_1(func, i + 1, __VA_ARGS__)
50-
#define TF_REPEAT_3(func, i, arg, ...) \
51-
func(i, arg) TF_REPEAT_2(func, i + 1, __VA_ARGS__)
52-
#define TF_REPEAT_4(func, i, arg, ...) \
53-
func(i, arg) TF_REPEAT_3(func, i + 1, __VA_ARGS__)
54-
#define TF_REPEAT_5(func, i, arg, ...) \
55-
func(i, arg) TF_REPEAT_4(func, i + 1, __VA_ARGS__)
56-
#define TF_REPEAT_6(func, i, arg, ...) \
57-
func(i, arg) TF_REPEAT_5(func, i + 1, __VA_ARGS__)
58-
#define TF_REPEAT_7(func, i, arg, ...) \
59-
func(i, arg) TF_REPEAT_6(func, i + 1, __VA_ARGS__)
60-
#define TF_REPEAT_8(func, i, arg, ...) \
61-
func(i, arg) TF_REPEAT_7(func, i + 1, __VA_ARGS__)
62-
#define TF_REPEAT_9(func, i, arg, ...) \
63-
func(i, arg) TF_REPEAT_8(func, i + 1, __VA_ARGS__)
64-
#define TF_REPEAT_10(func, i, arg, ...) \
65-
func(i, arg) TF_REPEAT_9(func, i + 1, __VA_ARGS__)
66-
#define TF_REPEAT_11(func, i, arg, ...) \
67-
func(i, arg) TF_REPEAT_10(func, i + 1, __VA_ARGS__)
68-
#define TF_REPEAT_12(func, i, arg, ...) \
69-
func(i, arg) TF_REPEAT_11(func, i + 1, __VA_ARGS__)
70-
#define TF_REPEAT_13(func, i, arg, ...) \
71-
func(i, arg) TF_REPEAT_12(func, i + 1, __VA_ARGS__)
72-
#define TF_REPEAT_14(func, i, arg, ...) \
73-
func(i, arg) TF_REPEAT_13(func, i + 1, __VA_ARGS__)
74-
#define TF_REPEAT_15(func, i, arg, ...) \
75-
func(i, arg) TF_REPEAT_14(func, i + 1, __VA_ARGS__)
76-
#define TF_REPEAT_16(func, i, arg, ...) \
77-
func(i, arg) TF_REPEAT_15(func, i + 1, __VA_ARGS__)
78-
#define TF_REPEAT_17(func, i, arg, ...) \
79-
func(i, arg) TF_REPEAT_16(func, i + 1, __VA_ARGS__)
80-
#define TF_REPEAT_18(func, i, arg, ...) \
81-
func(i, arg) TF_REPEAT_17(func, i + 1, __VA_ARGS__)
82-
#define TF_REPEAT_19(func, i, arg, ...) \
83-
func(i, arg) TF_REPEAT_18(func, i + 1, __VA_ARGS__)
84-
#define TF_REPEAT_20(func, i, arg, ...) \
85-
func(i, arg) TF_REPEAT_19(func, i + 1, __VA_ARGS__)
86-
#define TF_REPEAT_21(func, i, arg, ...) \
87-
func(i, arg) TF_REPEAT_20(func, i + 1, __VA_ARGS__)
88-
#define TF_REPEAT_22(func, i, arg, ...) \
89-
func(i, arg) TF_REPEAT_21(func, i + 1, __VA_ARGS__)
90-
#define TF_REPEAT_23(func, i, arg, ...) \
91-
func(i, arg) TF_REPEAT_22(func, i + 1, __VA_ARGS__)
92-
#define TF_REPEAT_24(func, i, arg, ...) \
93-
func(i, arg) TF_REPEAT_23(func, i + 1, __VA_ARGS__)
94-
#define TF_REPEAT_25(func, i, arg, ...) \
95-
func(i, arg) TF_REPEAT_24(func, i + 1, __VA_ARGS__)
96-
#define TF_REPEAT_26(func, i, arg, ...) \
97-
func(i, arg) TF_REPEAT_25(func, i + 1, __VA_ARGS__)
98-
#define TF_REPEAT_27(func, i, arg, ...) \
99-
func(i, arg) TF_REPEAT_26(func, i + 1, __VA_ARGS__)
100-
#define TF_REPEAT_28(func, i, arg, ...) \
101-
func(i, arg) TF_REPEAT_27(func, i + 1, __VA_ARGS__)
102-
#define TF_REPEAT_29(func, i, arg, ...) \
103-
func(i, arg) TF_REPEAT_28(func, i + 1, __VA_ARGS__)
104-
#define TF_REPEAT_30(func, i, arg, ...) \
105-
func(i, arg) TF_REPEAT_29(func, i + 1, __VA_ARGS__)
106-
#define TF_REPEAT_31(func, i, arg, ...) \
107-
func(i, arg) TF_REPEAT_30(func, i + 1, __VA_ARGS__)
108-
#define TF_REPEAT_32(func, i, arg, ...) \
109-
func(i, arg) TF_REPEAT_31(func, i + 1, __VA_ARGS__)
110-
#define TF_REPEAT_33(func, i, arg, ...) \
111-
func(i, arg) TF_REPEAT_32(func, i + 1, __VA_ARGS__)
112-
#define TF_REPEAT_34(func, i, arg, ...) \
113-
func(i, arg) TF_REPEAT_33(func, i + 1, __VA_ARGS__)
114-
#define TF_REPEAT_35(func, i, arg, ...) \
115-
func(i, arg) TF_REPEAT_34(func, i + 1, __VA_ARGS__)
116-
#define TF_REPEAT_36(func, i, arg, ...) \
117-
func(i, arg) TF_REPEAT_35(func, i + 1, __VA_ARGS__)
118-
#define TF_REPEAT_37(func, i, arg, ...) \
119-
func(i, arg) TF_REPEAT_36(func, i + 1, __VA_ARGS__)
120-
#define TF_REPEAT_38(func, i, arg, ...) \
121-
func(i, arg) TF_REPEAT_37(func, i + 1, __VA_ARGS__)
122-
#define TF_REPEAT_39(func, i, arg, ...) \
123-
func(i, arg) TF_REPEAT_38(func, i + 1, __VA_ARGS__)
124-
#define TF_REPEAT_40(func, i, arg, ...) \
125-
func(i, arg) TF_REPEAT_39(func, i + 1, __VA_ARGS__)
126-
#define TF_REPEAT_41(func, i, arg, ...) \
127-
func(i, arg) TF_REPEAT_40(func, i + 1, __VA_ARGS__)
128-
#define TF_REPEAT_42(func, i, arg, ...) \
129-
func(i, arg) TF_REPEAT_41(func, i + 1, __VA_ARGS__)
130-
#define TF_REPEAT_43(func, i, arg, ...) \
131-
func(i, arg) TF_REPEAT_42(func, i + 1, __VA_ARGS__)
132-
#define TF_REPEAT_44(func, i, arg, ...) \
133-
func(i, arg) TF_REPEAT_43(func, i + 1, __VA_ARGS__)
134-
#define TF_REPEAT_45(func, i, arg, ...) \
135-
func(i, arg) TF_REPEAT_44(func, i + 1, __VA_ARGS__)
136-
#define TF_REPEAT_46(func, i, arg, ...) \
137-
func(i, arg) TF_REPEAT_45(func, i + 1, __VA_ARGS__)
138-
#define TF_REPEAT_47(func, i, arg, ...) \
139-
func(i, arg) TF_REPEAT_46(func, i + 1, __VA_ARGS__)
140-
#define TF_REPEAT_48(func, i, arg, ...) \
141-
func(i, arg) TF_REPEAT_47(func, i + 1, __VA_ARGS__)
142-
#define TF_REPEAT_49(func, i, arg, ...) \
143-
func(i, arg) TF_REPEAT_48(func, i + 1, __VA_ARGS__)
144-
#define TF_REPEAT_50(func, i, arg, ...) \
145-
func(i, arg) TF_REPEAT_49(func, i + 1, __VA_ARGS__)
146-
#define TF_REPEAT_51(func, i, arg, ...) \
147-
func(i, arg) TF_REPEAT_50(func, i + 1, __VA_ARGS__)
148-
#define TF_REPEAT_52(func, i, arg, ...) \
149-
func(i, arg) TF_REPEAT_51(func, i + 1, __VA_ARGS__)
150-
#define TF_REPEAT_53(func, i, arg, ...) \
151-
func(i, arg) TF_REPEAT_52(func, i + 1, __VA_ARGS__)
152-
#define TF_REPEAT_54(func, i, arg, ...) \
153-
func(i, arg) TF_REPEAT_53(func, i + 1, __VA_ARGS__)
154-
#define TF_REPEAT_55(func, i, arg, ...) \
155-
func(i, arg) TF_REPEAT_54(func, i + 1, __VA_ARGS__)
156-
#define TF_REPEAT_56(func, i, arg, ...) \
157-
func(i, arg) TF_REPEAT_55(func, i + 1, __VA_ARGS__)
158-
#define TF_REPEAT_57(func, i, arg, ...) \
159-
func(i, arg) TF_REPEAT_56(func, i + 1, __VA_ARGS__)
160-
#define TF_REPEAT_58(func, i, arg, ...) \
161-
func(i, arg) TF_REPEAT_57(func, i + 1, __VA_ARGS__)
162-
#define TF_REPEAT_59(func, i, arg, ...) \
163-
func(i, arg) TF_REPEAT_58(func, i + 1, __VA_ARGS__)
164-
#define TF_REPEAT_60(func, i, arg, ...) \
165-
func(i, arg) TF_REPEAT_59(func, i + 1, __VA_ARGS__)
166-
#define TF_REPEAT_61(func, i, arg, ...) \
167-
func(i, arg) TF_REPEAT_60(func, i + 1, __VA_ARGS__)
168-
#define TF_REPEAT_62(func, i, arg, ...) \
169-
func(i, arg) TF_REPEAT_61(func, i + 1, __VA_ARGS__)
170-
#define TF_REPEAT_63(func, i, arg, ...) \
171-
func(i, arg) TF_REPEAT_62(func, i + 1, __VA_ARGS__)
172-
#define TF_REPEAT_64(func, i, arg, ...) \
173-
func(i, arg) TF_REPEAT_63(func, i + 1, __VA_ARGS__)
32+
#define TF_MAP0(f, x, peek, ...) \
33+
f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP1))(f, peek, __VA_ARGS__)
34+
#define TF_MAP1(f, x, peek, ...) \
35+
f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP0))(f, peek, __VA_ARGS__)
17436

175-
#define TF_CONCATE(x, y) x##y
176-
#define TF_PASTE(x, y) TF_CONCATE(x, y)
37+
#define TF_MAP(f, ...) \
38+
TF_EVAL(TF_MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))

taskflow/dsl/task_dsl.hpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// 2020/08/28 - Created by netcan: https://github.com/netcan
22
#pragma once
33
#include "../core/flow_builder.hpp"
4-
#include "task_trait.hpp"
54
#include "meta_macro.hpp"
65
#include "task_analyzer.hpp"
6+
#include "task_trait.hpp"
77

88
namespace tf {
99
namespace dsl {
@@ -18,7 +18,8 @@ template <typename CONTEXT = EmptyContext, typename... Chains> class TaskDsl {
1818
using type = TaskCb<TASK, CONTEXT>;
1919
};
2020
using TasksCB =
21-
typename Map_t<AllTasks, TaskCbWithContext>::template exportTo<std::tuple>;
21+
typename Map_t<AllTasks,
22+
TaskCbWithContext>::template exportTo<std::tuple>;
2223

2324
using OneToOneLinkSet = typename Analyzer::OneToOneLinkSet;
2425
template <typename OneToOneLink> struct OneToOneLinkInstanceType {
@@ -31,23 +32,22 @@ template <typename CONTEXT = EmptyContext, typename... Chains> class TaskDsl {
3132
public:
3233
constexpr TaskDsl(FlowBuilder &flow_builder, const CONTEXT &context = {}) {
3334
build_tasks_cb(flow_builder, context,
34-
std::make_index_sequence<AllTasks::size>{});
35+
std::make_index_sequence<AllTasks::size>{});
3536
build_links(std::make_index_sequence<OneToOneLinkSet::size>{});
3637
}
3738

38-
template<typename TASK>
39-
Task& get_task() {
40-
constexpr size_t TasksCBSize = std::tuple_size<TasksCB>::value;
41-
constexpr size_t TaskIndex =
42-
TupleElementByF_v<TasksCB, IsTask<TASK>::template apply>;
43-
static_assert(TaskIndex < TasksCBSize, "fatal: not find TaskCb in TasksCB");
44-
return std::get<TaskIndex>(tasksCb_).task_;
39+
template <typename TASK> Task &get_task() {
40+
constexpr size_t TasksCBSize = std::tuple_size<TasksCB>::value;
41+
constexpr size_t TaskIndex =
42+
TupleElementByF_v<TasksCB, IsTask<TASK>::template apply>;
43+
static_assert(TaskIndex < TasksCBSize, "fatal: not find TaskCb in TasksCB");
44+
return std::get<TaskIndex>(tasksCb_).task_;
4545
}
4646

4747
private:
4848
template <size_t... Is>
4949
void build_tasks_cb(FlowBuilder &flow_builder, const CONTEXT &context,
50-
std::index_sequence<Is...>) {
50+
std::index_sequence<Is...>) {
5151
auto _ = {0, (std::get<Is>(tasksCb_).build(flow_builder, context), 0)...};
5252
(void)_;
5353
}
@@ -72,17 +72,17 @@ constexpr TaskDsl<CONTEXT, Chains...> taskDsl(FlowBuilder &flow_builder,
7272
} // namespace tf
7373

7474
///////////////////////////////////////////////////////////////////////////////
75-
#define chain(n, link) , link->void
75+
#define chain(link) , link->void
7676

7777
///////////////////////////////////////////////////////////////////////////////
7878
// def_task(TASK_NAME, { return a action lambda })
7979
#define def_task(name, ...) \
80-
struct name : tf::dsl::TaskSignature, tf::dsl::EmptyContext { \
80+
struct name : tf::dsl::TaskSignature, tf::dsl::EmptyContext { \
8181
name(const EmptyContext &context) : EmptyContext(context) {} \
8282
auto operator()() { return [] __VA_ARGS__; } \
8383
};
8484
#define def_taskc(name, Context, ...) \
85-
struct name : tf::dsl::TaskSignature, Context { \
85+
struct name : tf::dsl::TaskSignature, Context { \
8686
name(const Context &context) : Context(context) {} \
8787
auto operator()() { \
8888
/* copy *this(copy CONTEXT to lambda) */ \
@@ -99,6 +99,4 @@ constexpr TaskDsl<CONTEXT, Chains...> taskDsl(FlowBuilder &flow_builder,
9999
// task(A) means a task A
100100
#define task(Task) auto (*)(Task)
101101
// taskbuild(...) build a task dsl graph
102-
#define taskbuild(...) \
103-
tf::dsl::taskDsl<void TF_PASTE(TF_REPEAT_, TF_GET_ARG_COUNT(__VA_ARGS__))( \
104-
chain, 0, __VA_ARGS__)>
102+
#define taskbuild(...) tf::dsl::taskDsl<void TF_MAP(chain, __VA_ARGS__)>

taskflow/dsl/task_trait.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ template <typename TASK, typename CONTEXT> struct TaskCb {
1919
};
2020

2121
template <typename TASK> struct IsTask {
22-
template <typename TaskCb> struct apply {
22+
template <typename TaskCb> struct apply {
2323
constexpr static bool value =
2424
std::is_same<typename TaskCb::TaskType, TASK>::value;
25-
};
25+
};
2626
};
2727

2828
template <typename TASK, typename = void> struct TaskTrait;
@@ -34,7 +34,8 @@ template <typename... TASK> struct SomeTask {
3434

3535
// a task self
3636
template <typename TASK>
37-
struct TaskTrait<TASK, std::enable_if_t<std::is_base_of<TaskSignature, TASK>::value>> {
37+
struct TaskTrait<
38+
TASK, std::enable_if_t<std::is_base_of<TaskSignature, TASK>::value>> {
3839
using TaskList = TypeList<TASK>;
3940
};
4041

0 commit comments

Comments
 (0)