diff options
author | John Hodge <tpg@mutabah.net> | 2016-01-30 21:59:16 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-01-30 21:59:16 +0800 |
commit | 0b8f4dfa88d392ab188c3ee85e1afe1e3658cca5 (patch) | |
tree | f3046716b75c64d263a6826c54c801c7105ecf44 /src/include | |
parent | 3cb317bdb5be06ea0c4ccad8ecb5bb21b74509cc (diff) | |
download | mrust-0b8f4dfa88d392ab188c3ee85e1afe1e3658cca5.tar.gz |
Better pretty printing, updated resolution logic
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/cpp_unpack.h | 33 | ||||
-rw-r--r-- | src/include/span.hpp | 1 | ||||
-rw-r--r-- | src/include/tagged_union.hpp | 6 |
3 files changed, 38 insertions, 2 deletions
diff --git a/src/include/cpp_unpack.h b/src/include/cpp_unpack.h new file mode 100644 index 00000000..d5087668 --- /dev/null +++ b/src/include/cpp_unpack.h @@ -0,0 +1,33 @@ + +#ifndef _CPP_UNAPCK_H_ +#define _CPP_UNAPCK_H_ + +#define CC_EXP(...) __VA_ARGS__ + +// - Calls the passed function, expanding 'a' but leaving _1 as a single argument +#define CC_CALL_A(__fcn, __args) __fcn __args +#define CC_CALL_A1(f, a, _1) CC_CALL_A(f, (CC_EXP a, _1)) +#define CC_CALL_A2(f, a, _1, _2) CC_CALL_A(f, (CC_EXP a, _1)) CC_CALL_A(f, (CC_EXP a, _2)) +#define CC_CALL_A3(f, a, _1, _2, _3) CC_CALL_A(f, (CC_EXP a, _1)) CC_CALL_A(f, (CC_EXP a, _2)) CC_CALL_A(f, (CC_EXP a, _3)) + +#define CC_CALL_A4(fn, a, a1,a2, b1,b2) CC_CALL_A2(fn,a, a1,a2) CC_CALL_A2(fn,a, b1,b2) +#define CC_CALL_A5(fn, a, a1,a2,a3, b1,b2) CC_CALL_A3(fn,a, a1,a2,a3) CC_CALL_A2(fn,a, b1,b2) +#define CC_CALL_A6(fn, a, a1,a2,a3, b1,b2,b3) CC_CALL_A3(fn,a, a1,a2,a3) CC_CALL_A3(fn,a, b1,b2,b3) +#define CC_CALL_A7(fn, a, a1,a2,a3, b1,b2, c1,c2) CC_CALL_A3(fn,a, a1,a2,a3) CC_CALL_A2(fn,a, b1,b2) CC_CALL_A2(fn,a, c1,c2) +#define CC_CALL_A8(fn, a, a1,a2,a3, b1,b2,b3, c1,c2) CC_CALL_A3(fn,a, a1,a2,a3) CC_CALL_A3(fn,a, b1,b2,b3) CC_CALL_A2(fn,a, c1,c2) +#define CC_CALL_A9(fn, a, a1,a2,a3, b1,b2,b3, c1,c2,c3) CC_CALL_A3(fn,a, a1,a2,a3) CC_CALL_A3(fn,a, b1,b2,b3) CC_CALL_A3(fn,a, c1,c2,c3) +#define CC_CALL_A10(f, a, a1,a2,a3, b1,b2,b3, c1,c2,c3, d1) CC_CALL_A3(f,a, a1,a2,a3) CC_CALL_A3(f,a, b1,b2,b3) CC_CALL_A3(f,a, c1,c2,c3) CC_CALL_A(f, (CC_EXP a, CC_EXP d1)) +#define CC_CALL_A11(f, a, a1,a2,a3, b1,b2,b3, c1,c2,c3, d1,d2) CC_CALL_A3(f,a, a1,a2,a3) CC_CALL_A3(f,a, b1,b2,b3) CC_CALL_A3(f,a, c1,c2,c3) CC_CALL_A2(f,a, d1,d2) +#define CC_CALL_A12(f, a, a1,a2,a3, b1,b2,b3, c1,c2,c3, d1,d2,d3) CC_CALL_A3(f,a, a1,a2,a3) CC_CALL_A3(f,a, b1,b2,b3) CC_CALL_A3(f,a, c1,c2,c3) CC_CALL_A3(f,a, d1,d2,d3) +#define CC_CALL_A13(f, a, a1,a2,a3,a4, b1,b2,b3, c1,c2,c3, d1,d2,d3) CC_CALL_A4(f,a, a1,a2,a3,a4) CC_CALL_A3(f,a, b1,b2,b3) CC_CALL_A3(f,a, c1,c2,c3) CC_CALL_A3(f,a, d1,d2,d3) +#define CC_CALL_A14(f, a, a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3, d1,d2,d3) CC_CALL_A4(f,a, a1,a2,a3,a4) CC_CALL_A4(f,a, b1,b2,b3,b4) CC_CALL_A3(f,a, c1,c2,c3) CC_CALL_A3(f,a, d1,d2,d3) + +// Macro to obtain a numbered macro for argument counts +// - Raw variant +#define CC_GM_I(SUF,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,COUNT,...) SUF##COUNT +#define CC_GM(SUF,...) CC_GM_I(SUF,__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1) + +#define CC_ITERATE(fcn, args, ...) CC_EXP( CC_GM(CC_CALL_A, __VA_ARGS__)(fcn, args, __VA_ARGS__) ) + +#endif + diff --git a/src/include/span.hpp b/src/include/span.hpp index 7a4c60b0..7603b080 100644 --- a/src/include/span.hpp +++ b/src/include/span.hpp @@ -61,4 +61,5 @@ struct Spanned #define ERROR(span, code, msg) do { (Span()/*span*/).error(code, [&](::std::ostream& os) { os << msg; }); throw ::std::runtime_error("Error fell through" #code); } while(0) #define BUG(span, msg) do { (span).bug([&](::std::ostream& os) { os << msg; }); throw ::std::runtime_error("Bug fell through"); } while(0) +#define TODO(span, msg) do { (span).bug([&](::std::ostream& os) { os << "TODO: " << msg; }); throw ::std::runtime_error("Bug (todo) fell through"); } while(0) diff --git a/src/include/tagged_union.hpp b/src/include/tagged_union.hpp index 91b7e646..045ecd96 100644 --- a/src/include/tagged_union.hpp +++ b/src/include/tagged_union.hpp @@ -8,6 +8,8 @@ #ifndef INCLUDED_TAGGED_UNION_H_ #define INCLUDED_TAGGED_UNION_H_ +//#include "cpp_unpack.h" + #define TU_CASE_ITEM(src, mod, var, name) mod auto& name = src.as_##var(); (void)&name; #define TU_CASE_BODY(class,var, ...) case class::var: { __VA_ARGS__ } break; #define TU_CASE(mod, class, var, name,src, ...) TU_CASE_BODY(mod,class,var, TU_CASE_ITEM(src,mod,var,name) __VA_ARGS__) @@ -18,8 +20,8 @@ // Argument iteration #define _DISP1(n, _1) n _1 #define _DISP2(n, _1, _2) n _1 n _2 -#define _DISP3(n, v, v2, v3) n v n v2 n v3 // _DISP2(n, __VA_ARGS__) -#define _DISP4(n, v, v2, v3, v4) n v n v2 n v3 n v4 // #define _DISP4(n, v, ...) n v _DISP3(n, __VA_ARGS__) +#define _DISP3(n, v, v2, v3) n v n v2 n v3 +#define _DISP4(n, v, v2, v3, v4) n v n v2 n v3 n v4 #define _DISP5(n, v, ...) n v _DISP4(n, __VA_ARGS__) #define _DISP6(n, v, ...) n v _DISP5(n, __VA_ARGS__) #define _DISP7(n, v, ...) n v _DISP6(n, __VA_ARGS__) |