#include #include "test.hpp" #define MATRIX(M, N) \ CHECK((metal::is_invocable, VALUE(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), MAP(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), MAP(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), MAP(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), MAP(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), PAIR(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), LIST(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), MAP(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(M), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(M), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(M), PAIR(N)>), (BOOL(M == 2))); \ CHECK((metal::is_invocable, LAMBDA(M), LIST(N)>), (BOOL(M == N))); \ CHECK((metal::is_invocable, LAMBDA(M), MAP(N)>), (BOOL(M == N))); \ CHECK((metal::is_invocable, LAMBDA(M), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(M), LAMBDA(_)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(_), VALUE(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(_), NUMBER(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(_), PAIR(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_), LIST(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_), MAP(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_), LAMBDA(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(_), LAMBDA(_)>), (FALSE)); \ CHECK((metal::apply), (EXPR(2))); \ CHECK((metal::apply), (EXPR(_))); \ CHECK((metal::apply), (EXPR(M))); \ CHECK((metal::apply), (EXPR(_))); \ CHECK((metal::apply), (EXPR(M))); \ CHECK((metal::apply), (EXPR(_))); \ /**/ GEN(MATRIX)