summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2015-03-19 11:22:18 +0800
committerJohn Hodge <tpg@mutabah.net>2015-03-19 11:22:18 +0800
commita1e8e5a056ec064177cf5f67766450175e435639 (patch)
treed04d9ca1e7795c08f555256159879827f7360c41 /src/include
parent2eb0ef0364591ff9ad30fcefa795bfd8eba17dea (diff)
downloadmrust-a1e8e5a056ec064177cf5f67766450175e435639.tar.gz
Clean up copy constructor use, switch part of AST::Pattern to tagged union
Diffstat (limited to 'src/include')
-rw-r--r--src/include/serialise.hpp2
-rw-r--r--src/include/tagged_enum.hpp22
2 files changed, 16 insertions, 8 deletions
diff --git a/src/include/serialise.hpp b/src/include/serialise.hpp
index 07812899..4b482f9b 100644
--- a/src/include/serialise.hpp
+++ b/src/include/serialise.hpp
@@ -173,7 +173,7 @@ public:
while(count--) {
::std::pair<T1,T2> e;
item(e);
- v.insert( e );
+ v.insert( ::std::move(e) );
}
end_array();
}
diff --git a/src/include/tagged_enum.hpp b/src/include/tagged_enum.hpp
index 07bd5881..2ef1b034 100644
--- a/src/include/tagged_enum.hpp
+++ b/src/include/tagged_enum.hpp
@@ -19,6 +19,7 @@
#define TE_CONS4(a, ...) TE_CONS a TE_CONS3(__VA_ARGS__)
#define TE_CONS5(a, ...) TE_CONS a TE_CONS4(__VA_ARGS__)
#define TE_CONS6(a, ...) TE_CONS a TE_CONS5(__VA_ARGS__)
+#define TE_CONS7(a, ...) TE_CONS a TE_CONS6(__VA_ARGS__)
// Sizes of structures
#define TE_SO(name, _) sizeof(TE_DATANAME(name))
@@ -28,6 +29,7 @@
#define MAXS4(a, b, c, d) MAX2(MAXS2(a, b), MAXS2(c, d))
#define MAXS5(a, b, c, d, e) MAX2(MAXS3(a, b, c), MAXS2(d, e))
#define MAXS6(a, b, c, d, e, f) MAX2(MAXS3(a, b, c), MAXS3(d, e, f))
+#define MAXS7(a, b, c, d, e, f, g) MAX2(MAXS3(a, b, c), MAXS4(d, e, f, g))
// Type definitions
#define TE_EXP(...) __VA_ARGS__
@@ -37,6 +39,7 @@
#define TE_TYPEDEF4(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF3(__VA_ARGS__)
#define TE_TYPEDEF5(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF4(__VA_ARGS__)
#define TE_TYPEDEF6(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF5(__VA_ARGS__)
+#define TE_TYPEDEF7(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF6(__VA_ARGS__)
#define TE_TAG(name, _) name,
#define TE_TAG2(_1,_2) TE_TAG _1 TE_TAG _2
@@ -44,6 +47,7 @@
#define TE_TAG4(_1,...) TE_TAG _1 TE_TAG3(__VA_ARGS__)
#define TE_TAG5(_1,...) TE_TAG _1 TE_TAG4(__VA_ARGS__)
#define TE_TAG6(_1,...) TE_TAG _1 TE_TAG5(__VA_ARGS__)
+#define TE_TAG7(_1,...) TE_TAG _1 TE_TAG6(__VA_ARGS__)
#define TE_DEST_CASE(tag, _) case tag: as_##tag().~TE_DATANAME(tag)(); break;
#define TE_DEST_CASE2(_1,_2) TE_DEST_CASE _1 TE_DEST_CASE _2
@@ -51,6 +55,7 @@
#define TE_DEST_CASE4(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE3(__VA_ARGS__)
#define TE_DEST_CASE5(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE4(__VA_ARGS__)
#define TE_DEST_CASE6(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE5(__VA_ARGS__)
+#define TE_DEST_CASE7(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE6(__VA_ARGS__)
#define TE_MOVE_CASE(tag, _) case tag: new(m_data) TE_DATANAME(tag)(x.unwrap_##tag()); break;
#define TE_MOVE_CASE2(_1,_2) TE_MOVE_CASE _1 TE_MOVE_CASE _2
@@ -58,16 +63,17 @@
#define TE_MOVE_CASE4(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE3(__VA_ARGS__)
#define TE_MOVE_CASE5(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE4(__VA_ARGS__)
#define TE_MOVE_CASE6(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE5(__VA_ARGS__)
+#define TE_MOVE_CASE7(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE6(__VA_ARGS__)
// Macro to obtain a numbered macro for argument counts
-#define TE_GM(SUF,_1,_2,_3,_4,_5,_6,COUNT,...) SUF##COUNT
+#define TE_GM(SUF,_1,_2,_3,_4,_5,_6,_7,COUNT,...) SUF##COUNT
-#define MAXS(...) TE_GM(MAXS ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_TYPEDEFS(...) TE_GM(TE_TYPEDEF ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_TAGS(...) TE_GM(TE_TAG ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_DEST_CASES(...) TE_GM(TE_DEST_CASE,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_MOVE_CASES(...) TE_GM(TE_MOVE_CASE,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
-#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__,6,5,4,3,2)(__VA_ARGS__)
+#define MAXS(...) TE_GM(MAXS ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_TYPEDEFS(...) TE_GM(TE_TYPEDEF ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_TAGS(...) TE_GM(TE_TAG ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_DEST_CASES(...) TE_GM(TE_DEST_CASE,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_MOVE_CASES(...) TE_GM(TE_MOVE_CASE,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
+#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__,7,6,5,4,3,2)(__VA_ARGS__)
#define TAGGED_ENUM(_name, _def, ...) \
class _name { \
@@ -79,7 +85,9 @@ class _name { \
char m_data[MAXS(__VA_ARGS__)]; \
public:\
_name(): m_tag(_def) {}\
+ _name(const _name&) = delete; \
_name(_name&& x): m_tag(x.m_tag) { x.m_tag = _def; switch(m_tag) { TE_MOVE_CASES(__VA_ARGS__) } } \
+ _name& operator =(_name&& x) { this->~_name(); m_tag = x.m_tag; x.m_tag = _def; switch(m_tag) { TE_MOVE_CASES(__VA_ARGS__) }; return *this; } \
~_name() { switch(m_tag) { TE_DEST_CASES(__VA_ARGS__) } } \
TE_CONSS(__VA_ARGS__) \
}