| 165 | } |
| 166 | |
| 167 | void OpDefEmitter::emit_tpl_spl() { |
| 168 | for (auto&& i : op.getMgbAttributes()) { |
| 169 | if (auto attr = llvm::dyn_cast<MgbEnumAttr>(&i.attr)) { |
| 170 | if (attr->supportToString()) { |
| 171 | std::vector<std::string> case_body; |
| 172 | std::string ename = |
| 173 | formatv("{0}::{1}", op.getCppClassName(), attr->getEnumName()); |
| 174 | llvm::for_each(attr->getEnumMembers(), [&](auto&& v) { |
| 175 | size_t d1 = v.find(' '); |
| 176 | size_t d2 = v.find('='); |
| 177 | size_t d = d1 <= d2 ? d1 : d2; |
| 178 | case_body.push_back(formatv( |
| 179 | "case {0}::{1}: return \"{1}\";", ename, v.substr(0, d))); |
| 180 | }); |
| 181 | os << formatv( |
| 182 | R"( |
| 183 | template <> |
| 184 | struct ToStringTrait<{0}> { |
| 185 | std::string operator()({0} e) const { |
| 186 | switch (e) { |
| 187 | {1} |
| 188 | default: |
| 189 | return "{0}::Unknown"; |
| 190 | } |
| 191 | } |
| 192 | }; |
| 193 | )", |
| 194 | ename, llvm::join(case_body, "\n")); |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | void OpDefEmitter::emit_body() { |
| 201 | auto&& className = op.getCppClassName(); |
no test coverage detected