Skip to content

Commit 94a58c1

Browse files
committed
refactor: add concept consruction macros
1 parent baf6f83 commit 94a58c1

File tree

1 file changed

+45
-49
lines changed

1 file changed

+45
-49
lines changed

src/NyuTestUtil.hpp

Lines changed: 45 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,39 @@
1717
namespace nyu {
1818

1919

20+
// Macros
21+
22+
#define NYU_META_ASSIGNABLE_CONCEPTS(NAME, MEMBER) \
23+
template <class T, class R> \
24+
concept NAME = requires(T t, R r) { (t.##MEMBER = r; }; \
25+
\
26+
template <class T, class R> \
27+
concept nothrow_##NAME = requires(T t, R r) { \
28+
{ (t.##MEMBER = r) } noexcept; \
29+
};
30+
31+
#define NYU_META_MEMBER_CALLABLE_CONCEPTS(NAME, METHOD) \
32+
template <class T, class... Args> \
33+
concept NAME = requires(T t, Args&&... as) { \
34+
(t.##METHOD)(static_cast<Args&&>(as)...); \
35+
}; \
36+
\
37+
template <class T, class... Args> \
38+
concept nothrow_##NAME = requires(T t, Args&&... as) { \
39+
{ (t.##METHOD)(static_cast<Args&&>(as)...) } noexcept; \
40+
};
41+
42+
#define NYU_META_CALLABLE_CONCEPTS(NAME, FUNCTION) \
43+
template <class T, class... Args> \
44+
concept NAME = requires(T t, Args&&... as) { \
45+
(FUNCTION)(T, static_cast<Args&&>(as)...); \
46+
}; \
47+
\
48+
template <class T, class... Args> \
49+
concept nothrow_##NAME = requires(T t, Args&&... as) { \
50+
{ (FUNCTION)(T, static_cast<Args&&>(as)...) } noexcept; \
51+
};
52+
2053
// Concepts
2154

2255
template <typename Tag, typename... Args>
@@ -27,36 +60,17 @@ template <typename Tag, typename... Args>
2760
concept nothrow_tag_invocable = tag_invocable<Tag, Args...> &&
2861
noexcept(tag_invoke(std::declval<Tag>(), std::declval<Args>()...));
2962

30-
template <typename T>
31-
concept has_eval = requires(T t) { t.eval(); };
32-
33-
template <typename T>
34-
concept nothrow_has_eval = requires(T t) {
35-
{ t.eval() } noexcept;
36-
};
37-
38-
template <typename T, typename R = int>
39-
concept has_clk_assign_from = requires(T t, R r) { t.clk = r; };
40-
41-
template <typename T, typename R = int>
42-
concept nothrow_has_clk_assign_from = requires(T t, R r) {
43-
{ t.clk = r } noexcept;
44-
};
45-
46-
template <typename T, typename R = int>
47-
concept has_nreset_assign_from = requires(T t, R r) { t.nReset = r; };
48-
49-
template <typename T, typename R = int>
50-
concept nothrow_has_nreset_assign_from = requires(T t, R r) {
51-
{ t.nReset = r } noexcept;
52-
};
63+
NYU_META_MEMBER_CALLABLE_CONCEPTS(has_eval, eval)
64+
NYU_META_ASSIGNABLE_CONCEPTS(has_clk_assign_from, clk)
65+
NYU_META_ASSIGNABLE_CONCEPTS(has_nreset_assign_from, nReset)
5366

5467
template <typename T>
5568
concept is_trace_capable = requires { T::traceCapable; } && T::traceCapable;
5669

5770
template <typename T>
58-
concept can_trace =
59-
is_trace_capable<T> && requires(T t) { t.trace(nullptr, 0, 0); };
71+
concept can_trace = is_trace_capable<T> && requires(T t) {
72+
t.trace(static_cast<VerilatedTraceBaseC*>(nullptr), 0, 0);
73+
};
6074

6175
template <typename T>
6276
concept nothrow_can_trace = is_trace_capable<T> && requires(T t) {
@@ -96,7 +110,7 @@ struct eval_t {
96110
if constexpr(tag_invocable<eval_t, Dut&, std::size_t>) {
97111
return tag_invoke(*this, dut, cycles);
98112
} else {
99-
return eval_default(dut, cycles);
113+
return ::nyu::eval_default(dut, cycles);
100114
}
101115
}
102116
};
@@ -106,13 +120,7 @@ inline constexpr eval_t eval {};
106120
}
107121
using cpo::eval;
108122

109-
template <typename T>
110-
concept can_call_eval = requires(T t) { ::nyu::eval(t); };
111-
112-
template <typename T>
113-
concept nothrow_can_call_eval = requires(T t) {
114-
{ ::nyu::eval(t) } noexcept;
115-
};
123+
NYU_META_CALLABLE_CONCEPTS(can_call_eval, ::nyu::eval)
116124

117125

118126
// Tick
@@ -157,7 +165,7 @@ struct tick_t {
157165
if constexpr(tag_invocable<tick_t, Dut&, std::size_t>) {
158166
return tag_invoke(*this, dut, cycles);
159167
} else {
160-
return tick_default(dut, cycles);
168+
return ::nyu::tick_default(dut, cycles);
161169
}
162170
}
163171
};
@@ -167,13 +175,7 @@ inline constexpr tick_t tick {};
167175
}
168176
using cpo::tick;
169177

170-
template <typename T>
171-
concept can_call_tick = requires(T t) { ::nyu::tick(t); };
172-
173-
template <typename T>
174-
concept nothrow_can_call_tick = requires(T t) {
175-
{ ::nyu::tick(t) } noexcept;
176-
};
178+
NYU_META_CALLABLE_CONCEPTS(can_call_tick, ::nyu::tick)
177179

178180

179181
// Reset
@@ -221,7 +223,7 @@ struct reset_t {
221223
static_assert(sizeof...(Args) == 0,
222224
"nyu::reset default does not accept extra parameters; provide a "
223225
"tag_invoke(nyu::reset_t, Dut&, ...) overload.");
224-
return reset_default(dut);
226+
return ::nyu::reset_default(dut);
225227
}
226228
}
227229
};
@@ -231,13 +233,7 @@ inline constexpr reset_t reset {};
231233
}
232234
using cpo::reset;
233235

234-
template <typename T>
235-
concept can_call_reset = requires(T t) { ::nyu::reset(t); };
236-
237-
template <typename T>
238-
concept nothrow_can_call_reset = requires(T t) {
239-
{ ::nyu::reset(t) } noexcept;
240-
};
236+
NYU_META_CALLABLE_CONCEPTS(can_call_reset, ::nyu::reset)
241237

242238

243239
// Tracer

0 commit comments

Comments
 (0)