diff options
Diffstat (limited to 'src/ast/attrs.hpp')
-rw-r--r-- | src/ast/attrs.hpp | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/src/ast/attrs.hpp b/src/ast/attrs.hpp index ebbad066..b7b7f91c 100644 --- a/src/ast/attrs.hpp +++ b/src/ast/attrs.hpp @@ -14,13 +14,18 @@ public: ::std::vector<MetaItem> m_items; MetaItems() {} + MetaItems(MetaItems&&) = default; + MetaItems& operator=(MetaItems&&) = default; + MetaItems(const MetaItems&) = delete; MetaItems(::std::vector<MetaItem> items): - m_items(items) + m_items( mv$(items) ) { } void push_back(MetaItem i); + MetaItems clone() const; + MetaItem* get(const char *name); bool has(const char *name) { return get(name) != 0; @@ -33,42 +38,66 @@ public: SERIALISABLE_PROTOTYPES(); }; + +TAGGED_UNION(MetaItemData, None, + (None, ()), + (String, ( + ::std::string val; + )), + (List, ( + ::std::vector<MetaItem> sub_items; + )) + ); + class MetaItem: public Serialisable { ::std::string m_name; - MetaItems m_sub_items; - ::std::string m_str_val; + MetaItemData m_data; public: MetaItem() {} MetaItem(::std::string name): - m_name(name) + m_name(name), + m_data( MetaItemData::make_None({}) ) { } MetaItem(::std::string name, ::std::string str_val): m_name(name), - m_str_val(str_val) + m_data( MetaItemData::make_String({mv$(str_val)}) ) { } MetaItem(::std::string name, ::std::vector<MetaItem> items): m_name(name), - m_sub_items(items) + m_data( MetaItemData::make_List({mv$(items)}) ) { } + MetaItem clone() const; + void mark_used() {} const ::std::string& name() const { return m_name; } - const ::std::string& string() const { return m_str_val; } - bool has_sub_items() const { return m_sub_items.m_items.size() > 0; } - const MetaItems& items() const { return m_sub_items; } - MetaItems& items() { return m_sub_items; } + + bool has_noarg() const { return m_data.is_None(); } + + bool has_string() const { return m_data.is_String(); } + const ::std::string& string() const { return m_data.as_String().val; } + + bool has_sub_items() const { return m_data.is_List(); } + const ::std::vector<MetaItem>& items() const { return m_data.as_List().sub_items; } + //::std::vector<MetaItem>& items() { return m_data.as_List().sub_items; } friend ::std::ostream& operator<<(::std::ostream& os, const MetaItem& x) { os << x.m_name; - if(x.m_sub_items.m_items.size()) - os << "(" << x.m_sub_items.m_items << ")"; - else - os << "=\"" << x.m_str_val << "\""; + TU_MATCH(MetaItemData, (x.m_data), (e), + (None, + ), + (String, + os << "=\"" << e.val << "\""; + ), + (List, + os << "(" << e.sub_items << ")"; + ) + ) return os; } |