From b0e44483f1f598d6e3aa5ca8b325560a843f162f Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 10 Mar 2016 11:13:10 +0800 Subject: AST - Clean up MetaItems/MetaItem --- src/ast/ast.cpp | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) (limited to 'src/ast/ast.cpp') diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index 35cab7a2..0bdbf5c0 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -12,6 +12,21 @@ namespace AST { +namespace { + ::std::vector clone_mivec(const ::std::vector& v) { + ::std::vector ri; + ri.reserve(v.size()); + for(const auto& i : v) + ri.push_back( i.clone() ); + return ri; + } +} + +MetaItems MetaItems::clone() const +{ + return MetaItems( clone_mivec(m_items) ); +} + void MetaItems::push_back(MetaItem i) { m_items.push_back( ::std::move(i) ); @@ -30,14 +45,32 @@ SERIALISE_TYPE_A(MetaItems::, "AST_MetaItems", { s.item(m_items); }) + +MetaItem MetaItem::clone() const +{ + TU_MATCH(MetaItemData, (m_data), (e), + (None, + return MetaItem(m_name); + ), + (String, + return MetaItem(m_name, e.val); + ), + (List, + return MetaItem(m_name, clone_mivec(e.sub_items)); + ) + ) + throw ::std::runtime_error("MetaItem::clone - Fell off end"); +} + + SERIALISE_TYPE(MetaItem::, "AST_MetaItem", { s << m_name; - s << m_str_val; - s << m_sub_items; + //s << m_str_val; + //s << m_sub_items; },{ s.item(m_name); - s.item(m_str_val); - s.item(m_sub_items); + //s.item(m_str_val); + //s.item(m_sub_items); }) bool ImplDef::matches(::std::vector& out_types, const Path& trait, const TypeRef& type) const -- cgit v1.2.3