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 = \
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
2254template <typename Tag, typename ... Args>
@@ -27,36 +59,17 @@ template <typename Tag, typename... Args>
2759concept 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
5466template <typename T>
5567concept is_trace_capable = requires { T::traceCapable; } && T::traceCapable;
5668
5769template <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
6174template <typename T>
6275concept 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}
107120using 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}
168175using 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}
232233using 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