summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-01-30 21:59:16 +0800
committerJohn Hodge <tpg@mutabah.net>2016-01-30 21:59:16 +0800
commit0b8f4dfa88d392ab188c3ee85e1afe1e3658cca5 (patch)
treef3046716b75c64d263a6826c54c801c7105ecf44 /src/include
parent3cb317bdb5be06ea0c4ccad8ecb5bb21b74509cc (diff)
downloadmrust-0b8f4dfa88d392ab188c3ee85e1afe1e3658cca5.tar.gz
Better pretty printing, updated resolution logic
Diffstat (limited to 'src/include')
-rw-r--r--src/include/cpp_unpack.h33
-rw-r--r--src/include/span.hpp1
-rw-r--r--src/include/tagged_union.hpp6
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__)