Skip to content

Commit e70080e

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

File tree

1 file changed

+44
-49
lines changed

1 file changed

+44
-49
lines changed

src/NyuTestUtil.hpp

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,38 @@
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 = \
34+
requires(T t, Args&&... as) { (t.METHOD)(static_cast<Args&&>(as)...); }; \
35+
\
36+
template <class T, class... Args> \
37+
concept nothrow_##NAME = requires(T t, Args&&... as) { \
38+
{ (t.METHOD)(static_cast<Args&&>(as)...) } noexcept; \
39+
};
40+
41+
#define NYU_META_CALLABLE_CONCEPTS(NAME, FUNCTION) \
42+
template <class T, class... Args> \
43+
concept NAME = requires(T t, Args&&... as) { \
44+
(FUNCTION)(t, static_cast<Args&&>(as)...); \
45+
}; \
46+
\
47+
template <class T, class... Args> \
48+
concept nothrow_##NAME = requires(T t, Args&&... as) { \
49+
{ (FUNCTION)(t, static_cast<Args&&>(as)...) } noexcept; \
50+
};
51+
2052
// Concepts
2153

2254
template <typename Tag, typename... Args>
@@ -27,36 +59,17 @@ template <typename Tag, typename... Args>
2759
concept nothrow_tag_invocable = tag_invocable<Tag, Args...> &&
2860
noexcept(tag_invoke(std::declval<Tag>(), std::declval<Args>()...));
2961

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-
};
62+
NYU_META_MEMBER_CALLABLE_CONCEPTS(has_eval, eval)
63+
NYU_META_ASSIGNABLE_CONCEPTS(has_clk_assign_from, clk)
64+
NYU_META_ASSIGNABLE_CONCEPTS(has_nreset_assign_from, nReset)
5365

5466
template <typename T>
5567
concept is_trace_capable = requires { T::traceCapable; } && T::traceCapable;
5668

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

6174
template <typename T>
6275
concept nothrow_can_trace = is_trace_capable<T> && requires(T t) {
@@ -96,7 +109,7 @@ struct eval_t {
96109
if constexpr(tag_invocable<eval_t, Dut&, std::size_t>) {
97110
return tag_invoke(*this, dut, cycles);
98111
} else {
99-
return eval_default(dut, cycles);
112+
return ::nyu::eval_default(dut, cycles);
100113
}
101114
}
102115
};
@@ -106,13 +119,7 @@ inline constexpr eval_t eval {};
106119
}
107120
using cpo::eval;
108121

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-
};
122+
NYU_META_CALLABLE_CONCEPTS(can_call_eval, ::nyu::eval)
116123

117124

118125
// Tick
@@ -157,7 +164,7 @@ struct tick_t {
157164
if constexpr(tag_invocable<tick_t, Dut&, std::size_t>) {
158165
return tag_invoke(*this, dut, cycles);
159166
} else {
160-
return tick_default(dut, cycles);
167+
return ::nyu::tick_default(dut, cycles);
161168
}
162169
}
163170
};
@@ -167,13 +174,7 @@ inline constexpr tick_t tick {};
167174
}
168175
using cpo::tick;
169176

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-
};
177+
NYU_META_CALLABLE_CONCEPTS(can_call_tick, ::nyu::tick)
177178

178179

179180
// Reset
@@ -221,7 +222,7 @@ struct reset_t {
221222
static_assert(sizeof...(Args) == 0,
222223
"nyu::reset default does not accept extra parameters; provide a "
223224
"tag_invoke(nyu::reset_t, Dut&, ...) overload.");
224-
return reset_default(dut);
225+
return ::nyu::reset_default(dut);
225226
}
226227
}
227228
};
@@ -231,13 +232,7 @@ inline constexpr reset_t reset {};
231232
}
232233
using cpo::reset;
233234

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-
};
235+
NYU_META_CALLABLE_CONCEPTS(can_call_reset, ::nyu::reset)
241236

242237

243238
// Tracer

0 commit comments

Comments
 (0)