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 | |
parent | 2eb0ef0364591ff9ad30fcefa795bfd8eba17dea (diff) | |
download | mrust-a1e8e5a056ec064177cf5f67766450175e435639.tar.gz |
Clean up copy constructor use, switch part of AST::Pattern to tagged union
-rw-r--r-- | src/ast/ast.cpp | 10 | ||||
-rw-r--r-- | src/ast/ast.hpp | 20 | ||||
-rw-r--r-- | src/ast/pattern.hpp | 54 | ||||
-rw-r--r-- | src/include/serialise.hpp | 2 | ||||
-rw-r--r-- | src/include/tagged_enum.hpp | 22 |
5 files changed, 48 insertions, 60 deletions
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<T>()
{}
- Item(::std::string&& name, T&& data, bool is_pub):
- ItemNS<T>( move(name), move(data), is_pub )
+ Item(Item&&) = default;
+ Item(const Item&) = default;
+ Item(::std::string name, T data, bool is_pub):
+ ItemNS<T>( ::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<TypeRef>(move(name), move(type), true) );
}
void add_function(::std::string name, Function fcn) {
- m_functions.push_back( Item<Function>(move(name), move(fcn), true) );
+ m_functions.push_back( Item<Function>(::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<ExprNode> m_node; - unique_ptr<ExprNode> m_node2; // ONLY used for range values ::std::vector<Pattern> m_sub_patterns; TAGGED_ENUM(Data, Any, (Any, () ), + (MaybeBind, () ), (Ref, (bool mut; unique_ptr<ExprNode> sub;) ), (Value, (unique_ptr<ExprNode> start; unique_ptr<ExprNode> end;) ), (Tuple, (::std::vector<Pattern> sub_patterns;) ), (StructTuple, (Path path; ::std::vector<Pattern> 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<ExprNode> node, unique_ptr<ExprNode> 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<ExprNode> take_node() { assert(m_class == VALUE); m_class = ANY; return ::std::move(m_node); } + ::std::unique_ptr<ExprNode> 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<Pattern>& 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<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__) \ } |