From a1e8e5a056ec064177cf5f67766450175e435639 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 19 Mar 2015 11:22:18 +0800 Subject: Clean up copy constructor use, switch part of AST::Pattern to tagged union --- src/ast/ast.cpp | 10 ++++----- src/ast/ast.hpp | 20 +++++++++++------ src/ast/pattern.hpp | 54 +++++++++++++-------------------------------- src/include/serialise.hpp | 2 +- src/include/tagged_enum.hpp | 22 ++++++++++++------ 5 files changed, 48 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index 3eb646e5..48517095 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -287,11 +287,7 @@ void Crate::load_extern_crate(::std::string name) m_extern_crates.insert( make_pair(::std::move(name), ::std::move(ret)) ); } -SERIALISE_TYPE(Crate::, "AST_Crate", { - s << m_load_std; - s << m_extern_crates; - s << m_root_module; -},{ +SERIALISE_TYPE_A(Crate::, "AST_Crate", { s.item(m_load_std); s.item(m_extern_crates); s.item(m_root_module); @@ -441,7 +437,7 @@ void Module::add_macro_import(const Crate& crate, ::std::string modname, ::std:: void Module::iterate_functions(fcn_visitor_t *visitor, const Crate& crate) { - for( auto fcn_item : this->m_functions ) + for( auto& fcn_item : this->m_functions ) { visitor(crate, *this, fcn_item.data); } @@ -493,6 +489,7 @@ SERIALISE_TYPE(Static::, "AST_Static", { case Function::CLASS_REFMETHOD: s << "REFMETHOD"; break; case Function::CLASS_MUTMETHOD: s << "MUTMETHOD"; break; case Function::CLASS_VALMETHOD: s << "VALMETHOD"; break; + case Function::CLASS_MUTVALMETHOD: s << "MUTVALMETHOD"; break; } return s; } @@ -504,6 +501,7 @@ void operator>>(::Deserialiser& s, Function::Class& fc) else if(n == "REFMETHOD") fc = Function::CLASS_REFMETHOD; else if(n == "MUTMETHOD") fc = Function::CLASS_MUTMETHOD; else if(n == "VALMETHOD") fc = Function::CLASS_VALMETHOD; + else if(n == "MUTVALMETHOD") fc = Function::CLASS_MUTVALMETHOD; else throw ::std::runtime_error("Deserialise Function::Class"); } diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index b38e9953..8274f22f 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -128,9 +128,11 @@ struct ItemNS ItemNS(): is_pub(false) {} - ItemNS(::std::string&& name, T&& data, bool is_pub): - name( move(name) ), - data( move(data) ), + ItemNS(ItemNS&&) = default; + ItemNS(const ItemNS&) = default; + ItemNS(::std::string name, T data, bool is_pub): + name( ::std::move(name) ), + data( ::std::move(data) ), is_pub( is_pub ) { } @@ -148,8 +150,10 @@ struct Item: Item(): ItemNS() {} - Item(::std::string&& name, T&& data, bool is_pub): - ItemNS( move(name), move(data), is_pub ) + Item(Item&&) = default; + Item(const Item&) = default; + Item(::std::string name, T data, bool is_pub): + ItemNS( ::std::move(name), ::std::move(data), is_pub ) {} SERIALISE_TYPE_A(, "Item", { s.item(this->name); @@ -297,9 +301,11 @@ public: Function(): m_fcn_class(CLASS_UNBOUND) {} + Function(const Function&) = delete; + Function(Function&&) = default; Function(TypeParams params, Class fcn_class, TypeRef ret_type, Arglist args): m_fcn_class(fcn_class), - m_params(params), + m_params( move(params) ), m_rettype( move(ret_type) ), m_args( move(args) ) { @@ -348,7 +354,7 @@ public: m_types.push_back( Item(move(name), move(type), true) ); } void add_function(::std::string name, Function fcn) { - m_functions.push_back( Item(move(name), move(fcn), true) ); + m_functions.push_back( Item(::std::move(name), ::std::move(fcn), true) ); } SERIALISABLE_PROTOTYPES(); diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp index a9a944fb..fde31201 100644 --- a/src/ast/pattern.hpp +++ b/src/ast/pattern.hpp @@ -30,51 +30,19 @@ private: BindType m_class; ::std::string m_binding; Path m_path; - unique_ptr m_node; - unique_ptr m_node2; // ONLY used for range values ::std::vector m_sub_patterns; TAGGED_ENUM(Data, Any, (Any, () ), + (MaybeBind, () ), (Ref, (bool mut; unique_ptr sub;) ), (Value, (unique_ptr start; unique_ptr end;) ), (Tuple, (::std::vector sub_patterns;) ), (StructTuple, (Path path; ::std::vector sub_patterns;) ), (Struct, (Path path; ::std::vector< ::std::pair< ::std::string,Pattern> > sub_patterns;) ) - ); + ) m_data; public: - Pattern(Pattern&& o) noexcept: - m_class(o.m_class), - m_binding( move(o.m_binding) ), - m_path( move(o.m_path) ), - m_node( move(o.m_node) ), - m_sub_patterns( move(o.m_sub_patterns) ) - { } - - Pattern(const Pattern& o): - m_class(o.m_class), - m_binding(o.m_binding), - m_path(o.m_path), - m_node(nullptr), - m_sub_patterns(o.m_sub_patterns) - { - if( o.m_node.get() ) { - DEBUG("Cloning " << o); - throw ::std::runtime_error(FMT("Cloning pattern with node : " << o)); - } - } - - Pattern& operator=(Pattern o) - { - m_class = o.m_class, - m_binding = move(o.m_binding); - m_path = move(o.m_path); - m_node = move(o.m_node); - m_sub_patterns = move(o.m_sub_patterns); - return *this; - } - Pattern(): m_class(ANY) {} @@ -101,8 +69,7 @@ public: struct TagValue {}; Pattern(TagValue, unique_ptr node, unique_ptr node2 = 0): m_class(VALUE), - m_node( ::std::move(node) ), - m_node2( ::std::move(node2) ) + m_data( Data::make_Value({ ::std::move(node), ::std::move(node2) }) ) {} @@ -132,13 +99,22 @@ public: m_binding = name; } - ::std::unique_ptr take_node() { assert(m_class == VALUE); m_class = ANY; return ::std::move(m_node); } + ::std::unique_ptr take_node() { + assert(m_class == VALUE); + m_class = ANY; + assert(m_data.is_Value()); + return ::std::move(m_data.unwrap_Value().start); + } // Accessors const ::std::string& binding() const { return m_binding; } BindType type() const { return m_class; } - ExprNode& node() { return *m_node; } - const ExprNode& node() const { return *m_node; } + ExprNode& node() { + return *m_data.as_Value().start; + } + const ExprNode& node() const { + return *m_data.as_Value().start; + } Path& path() { return m_path; } const Path& path() const { return m_path; } ::std::vector& sub_patterns() { return m_sub_patterns; } 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 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__) \ } -- cgit v1.2.3