summaryrefslogtreecommitdiff
path: root/src/ast/attrs.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast/attrs.hpp')
-rw-r--r--src/ast/attrs.hpp57
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;
}