diff options
author | John Hodge <tpg@mutabah.net> | 2015-03-19 11:22:18 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2015-03-19 11:22:18 +0800 |
commit | a1e8e5a056ec064177cf5f67766450175e435639 (patch) | |
tree | d04d9ca1e7795c08f555256159879827f7360c41 /src/include | |
parent | 2eb0ef0364591ff9ad30fcefa795bfd8eba17dea (diff) | |
download | mrust-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.hpp | 2 | ||||
-rw-r--r-- | src/include/tagged_enum.hpp | 22 |
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__) \ } |