tudocomp
– The TU Dortmund Compression Framework
ASTDef.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <iostream>
4 #include <string>
5 #include <utility>
6 #include <vector>
7 
8 #include <tudocomp/util/View.hpp>
9 
10 namespace tdc {
12  namespace ast {
13  class Value;
14  class Arg;
15  class Value {
16  bool m_is_invokation;
17  std::string m_invokation_name_or_value;
18  std::vector<Arg> m_invokation_arguments;
19  public:
20  inline Value():
21  m_is_invokation(false),
22  m_invokation_name_or_value("") {}
23  inline Value(std::string&& value):
24  m_is_invokation(false),
25  m_invokation_name_or_value(std::move(value)) {}
26  inline Value(std::string&& name, std::vector<Arg>&& args):
27  m_is_invokation(true),
28  m_invokation_name_or_value(std::move(name)),
29  m_invokation_arguments(std::move(args)) {}
30 
31  inline bool is_invokation() const {
32  return m_is_invokation;
33  }
34 
35  inline const std::string& invokation_name() const {
36  CHECK(is_invokation());
37  return m_invokation_name_or_value;
38  }
39  inline std::string& invokation_name() {
40  CHECK(is_invokation());
41  return m_invokation_name_or_value;
42  }
43 
44  inline const std::vector<Arg>& invokation_arguments() const {
45  CHECK(is_invokation());
46  return m_invokation_arguments;
47  }
48  inline std::vector<Arg>& invokation_arguments() {
49  CHECK(is_invokation());
50  return m_invokation_arguments;
51  }
52 
53  inline const std::string& string_value() const {
54  CHECK(!is_invokation());
55  return m_invokation_name_or_value;
56  }
57  inline std::string& string_value() {
58  CHECK(!is_invokation());
59  return m_invokation_name_or_value;
60  }
61 
62  inline std::string to_string() const;
63 
64  inline bool is_empty() const {
65  return m_invokation_name_or_value == "";
66  }
67 
68  friend inline bool operator==(const Value &lhs, const Value &rhs);
69  };
70  class Arg {
71  bool m_has_keyword;
72  bool m_has_type;
73  bool m_type_is_static;
74  Value m_value;
75  std::string m_keyword;
76  std::string m_type;
77  public:
78  inline Arg(Value&& value):
79  m_has_keyword(false),
80  m_has_type(false),
81  m_type_is_static(false),
82  m_value(std::move(value)) {}
83  inline Arg(View keyword, Value&& value):
84  m_has_keyword(true),
85  m_has_type(false),
86  m_type_is_static(false),
87  m_value(std::move(value)),
88  m_keyword(keyword)
89  {}
90  inline Arg(View keyword, bool is_static, View type, Value&& value):
91  m_has_keyword(true),
92  m_has_type(true),
93  m_type_is_static(is_static),
94  m_value(std::move(value)),
95  m_keyword(keyword),
96  m_type(type)
97  {}
98  inline Arg(bool is_static, View type, Value&& value):
99  m_has_keyword(false),
100  m_has_type(true),
101  m_type_is_static(is_static),
102  m_value(std::move(value)),
103  m_type(type)
104  {}
105 
106  inline bool has_keyword() const {
107  return m_has_keyword;
108  }
109  inline bool has_type() const {
110  return m_has_type;
111  }
112  inline bool type_is_static() const {
113  return m_type_is_static;
114  }
115  inline const std::string& keyword() const {
116  return m_keyword;
117  }
118  inline std::string& keyword() {
119  return m_keyword;
120  }
121 
122  inline const std::string& type() const {
123  return m_type;
124  }
125  inline std::string& type() {
126  return m_type;
127  }
128 
129  inline const Value& value() const {
130  return m_value;
131  }
132  inline Value& value() {
133  return m_value;
134  }
135 
136  inline std::string to_string() const;
137 
138  friend inline bool operator==(const Arg &lhs, const Arg &rhs);
139  };
140 
141  inline std::ostream& operator<<(std::ostream& os,
142  const Value& x) {
143  os << x.to_string();
144  return os;
145  }
146  inline std::ostream& operator<<(std::ostream& os,
147  const Arg& x) {
148  os << x.to_string();
149  return os;
150  }
151 
152  inline bool operator==(const Arg &lhs, const Arg &rhs);
153  inline bool operator==(const Value &lhs, const Value &rhs);
154 
155  inline bool operator!=(const Arg &lhs, const Arg &rhs) {
156  return !(lhs == rhs);
157  }
158  inline bool operator!=(const Value &lhs, const Value &rhs) {
159  return !(lhs == rhs);
160  }
161 
162  inline bool operator==(const Arg &lhs, const Arg &rhs) {
163  if (lhs.m_has_keyword != rhs.m_has_keyword) return false;
164  if (lhs.m_has_type != rhs.m_has_type) return false;
165  if (lhs.m_type_is_static != rhs.m_type_is_static) return false;
166  if (lhs.m_keyword != rhs.m_keyword) return false;
167  if (lhs.m_type != rhs.m_type) return false;
168  if (lhs.m_value != rhs.m_value) return false;
169  return true;
170  }
171 
172  inline bool operator==(const Value &lhs, const Value &rhs) {
173  if (lhs.m_is_invokation != rhs.m_is_invokation) return false;
174  if (lhs.m_invokation_name_or_value != rhs.m_invokation_name_or_value) return false;
175  if (lhs.m_invokation_arguments != rhs.m_invokation_arguments) return false;
176  return true;
177  }
178 
179  inline std::string Value::to_string() const {
180  std::stringstream ss;
181  if (is_invokation()) {
182  ss << invokation_name();
183  if (invokation_arguments().size() > 0) {
184  ss << "(";
185  bool first = true;
186  for (auto& a: invokation_arguments()) {
187  if (!first) {
188  ss << ", ";
189  }
190  ss << a;
191  first = false;
192  }
193  ss << ")";
194  }
195  } else {
196  ss << "\"" << string_value() << "\"";
197  }
198  return ss.str();
199  }
200 
201  inline std::string Arg::to_string() const {
202  std::stringstream ss;
203  if (has_keyword()) {
204  ss << keyword();
205  } else {
206  ss << value();
207  }
208  if (has_type()) {
209  ss << ": ";
210  if (type_is_static()) {
211  ss << "static ";
212  }
213  ss << type();
214  }
215  if (has_keyword()) {
216  ss << " = ";
217  ss << value();
218  }
219  return ss.str();
220  }
221  }
223 }
bool operator!=(const ConstGenericView< uliteral_t > &lhs, const ConstGenericView< uliteral_t > &rhs)
Contains the text compression and encoding framework.
Definition: namespaces.hpp:11
std::ostream & operator<<(std::ostream &os, const uint_impl_t< N > &v)
Definition: uint_t.hpp:135
bool operator==(const ConstGenericView< uliteral_t > &lhs, const ConstGenericView< uliteral_t > &rhs)
std::string to_string(tdc::uint_impl_t< N > value)
Definition: uint_t.hpp:241
ByteView View
Definition: View.hpp:25