1717namespace 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
2255template <typename Tag, typename ... Args>
@@ -27,36 +60,17 @@ template <typename Tag, typename... Args>
2760concept 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
5467template <typename T>
5568concept is_trace_capable = requires { T::traceCapable; } && T::traceCapable;
5669
5770template <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
6175template <typename T>
6276concept 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}
107121using 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}
168176using 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}
232234using 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