Use std::get_if instead of std::visit (#1367)

`std::visit` is (arguably) cleaner code, but older versions of gcc
and clang (not very old; the ones packaged with Ubuntu 22.04 LTS)
compile them as tables of function pointers, instead of efficient
jump tables.
This commit is contained in:
Sylvie
2024-03-20 22:37:54 -04:00
committed by GitHub
parent 035678d250
commit 0af1e512c2
10 changed files with 167 additions and 217 deletions

View File

@@ -62,28 +62,27 @@ std::string const &FileStackNode::name() const {
}
std::string const &FileStackNode::dump(uint32_t curLineNo) const {
Visitor visitor{
[this](std::vector<uint32_t> const &iters) -> std::string const & {
assert(this->parent); // REPT nodes use their parent's name
std::string const &lastName = this->parent->dump(this->lineNo);
fprintf(stderr, " -> %s", lastName.c_str());
for (uint32_t i = iters.size(); i--;)
fprintf(stderr, "::REPT~%" PRIu32, iters[i]);
return lastName;
},
[this](std::string const &name) -> std::string const & {
if (this->parent) {
this->parent->dump(this->lineNo);
fprintf(stderr, " -> %s", name.c_str());
} else {
fputs(name.c_str(), stderr);
}
return name;
},
};
std::string const &topName = std::visit(visitor, data);
fprintf(stderr, "(%" PRIu32 ")", curLineNo);
return topName;
if (std::holds_alternative<std::vector<uint32_t>>(data)) {
assert(parent); // REPT nodes use their parent's name
std::string const &lastName = parent->dump(lineNo);
fputs(" -> ", stderr);
fputs(lastName.c_str(), stderr);
std::vector<uint32_t> const &nodeIters = iters();
for (uint32_t i = nodeIters.size(); i--;) {
fprintf(stderr, "::REPT~%" PRIu32, nodeIters[i]);
}
fprintf(stderr, "(%" PRIu32 ")", curLineNo);
return lastName;
} else {
if (parent) {
parent->dump(lineNo);
fputs(" -> ", stderr);
}
std::string const &nodeName = name();
fputs(nodeName.c_str(), stderr);
fprintf(stderr, "(%" PRIu32 ")", curLineNo);
return nodeName;
}
}
void fstk_DumpCurrent() {