Viewing file: fold2.C (2.62 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { dg-do compile { target c++17 } } // { dg-options "" }
// Check that we can fold over all of the operators required // by the standard in every possible way.
#define COMMA ,
#define MAKE_FNS(name, op) \ template<typename... Ts> \ auto unary_left_ ## name (Ts... ts) { return (... op ts); } \ template<typename... Ts> \ auto unary_right_ ## name (Ts... ts) { return (ts op ...); } \ template<typename T, typename... Ts> \ auto binary_left_ ## name (T x, Ts... ts) { return (x op ... op ts); } \ template<typename T, typename... Ts> \ auto binary_right_ ## name (T x, Ts... ts) { return (ts op ... op x); }
// TODO: These are compile-only tests... #define CHECK_FN(name) \ unary_left_ ## name (a); \ unary_left_ ## name (a, b, c); \ unary_right_ ## name (a); \ unary_right_ ## name (a, b, c); \ binary_left_ ## name (a); \ binary_left_ ## name (a, b, c, d); \ binary_right_ ## name (d); \ binary_right_ ## name (d, a, b, c);
MAKE_FNS (add, +); MAKE_FNS (sub, -); MAKE_FNS (mul, *); MAKE_FNS (div, /); MAKE_FNS (mod, %); MAKE_FNS (bxor, ^); MAKE_FNS (bor, |); MAKE_FNS (band, &); MAKE_FNS (lsh, <<); MAKE_FNS (rsh, >>);
MAKE_FNS (assign, =); MAKE_FNS (addi, +=); MAKE_FNS (subi, -=); MAKE_FNS (muli, *=); MAKE_FNS (divi, /=); MAKE_FNS (modi, %=); MAKE_FNS (bxori, ^=); MAKE_FNS (bori, |=); MAKE_FNS (bandi, &=); MAKE_FNS (lshi, <<=); MAKE_FNS (rshi, >>=);
MAKE_FNS (eq, ==); MAKE_FNS (ne, !=); MAKE_FNS (lt, <); MAKE_FNS (gt, >); MAKE_FNS (le, <=); MAKE_FNS (ge, >=);
MAKE_FNS (land, &&); MAKE_FNS (lor, ||);
MAKE_FNS (comma, COMMA); MAKE_FNS (dot_star, .*); MAKE_FNS (arrow_star, ->*);
int main() { int a = 0, b = 0, c = 0, d = 0;
CHECK_FN (add); CHECK_FN (sub); CHECK_FN (mul); CHECK_FN (div); CHECK_FN (mod); CHECK_FN (bxor); CHECK_FN (bor); CHECK_FN (band); CHECK_FN (lsh); CHECK_FN (rsh);
// CHECK_FN (assign); CHECK_FN (addi); CHECK_FN (subi); CHECK_FN (muli); CHECK_FN (divi); CHECK_FN (modi); CHECK_FN (bxori); CHECK_FN (bori); CHECK_FN (bandi); CHECK_FN (lshi); CHECK_FN (rshi);
CHECK_FN (eq); CHECK_FN (ne); CHECK_FN (lt); CHECK_FN (gt); CHECK_FN (le); CHECK_FN (ge); CHECK_FN (eq); CHECK_FN (ne);
CHECK_FN (comma);
struct X { int a; } x, *px = &x;
int X::* pm = &X::a; unary_left_arrow_star (px, pm); // px ->* pm unary_right_arrow_star (px, pm); // px ->* pm binary_left_arrow_star (px, pm); // px ->* pm binary_right_arrow_star (pm, px); // px ->* pm
unary_left_dot_star (x, pm); // x ->* pm unary_right_dot_star (x, pm); // x ->* pm binary_left_dot_star (x, pm); // x ->* pm binary_right_dot_star (pm, x); // x ->* pm }
|