#include #include "test.hpp" #define MATRIX(M, N) \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) VALUES(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) NUMBERS(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) PAIRS(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) LISTS(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) MAPS(N)>), (FALSE)); \ CHECK((metal::is_invocable, VALUE(M) COMMA(N) LAMBDAS(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) VALUES(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) NUMBERS(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) PAIRS(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) LISTS(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) MAPS(N)>), (FALSE)); \ CHECK((metal::is_invocable, NUMBER(M) COMMA(N) LAMBDAS(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) VALUES(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) NUMBERS(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) PAIRS(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) LISTS(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) MAPS(N)>), (FALSE)); \ CHECK((metal::is_invocable, PAIR(M) COMMA(N) LAMBDAS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) VALUES(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) NUMBERS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) PAIRS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) LISTS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) MAPS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LIST(M) COMMA(N) LAMBDAS(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) VALUES(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) NUMBERS(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) PAIRS(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) LISTS(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) MAPS(N)>), (FALSE)); \ CHECK((metal::is_invocable, MAP(M) COMMA(N) LAMBDAS(N)>), (FALSE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) VALUES(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) NUMBERS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) PAIRS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) LISTS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) MAPS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(M) COMMA(N) LAMBDAS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) VALUES(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) NUMBERS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) PAIRS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) LISTS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) MAPS(N)>), (TRUE)); \ CHECK((metal::is_invocable, LAMBDA(_) COMMA(N) LAMBDAS(N)>), (TRUE)); \ CHECK((metal::is_invocable COMMA(N) VALUES(N)>), (BOOL(M == 2*N))); \ CHECK((metal::invoke COMMA(CMPL(M)) VALUES(CMPL(M))>), (EXPR(_))); \ /**/ GEN(MATRIX)