Small perfomance optimization in Directives and Tag methods

This commit is contained in:
hyperxor 2022-05-31 23:41:00 +03:00
parent 190ad502b5
commit 56f39208a5
4 changed files with 26 additions and 13 deletions

View File

@ -3,15 +3,19 @@
namespace YAML {
Directives::Directives() : version{true, 1, 2}, tags{} {}
const std::string Directives::TranslateTagHandle(
std::string Directives::TranslateTagHandle(
const std::string& handle) const {
std::string result;
auto it = tags.find(handle);
if (it == tags.end()) {
if (handle == "!!")
return "tag:yaml.org,2002:";
return handle;
result = "tag:yaml.org,2002:";
else
result = handle;
} else {
result = it->second;
}
return it->second;
return result;
}
} // namespace YAML

View File

@ -19,7 +19,7 @@ struct Version {
struct Directives {
Directives();
const std::string TranslateTagHandle(const std::string& handle) const;
std::string TranslateTagHandle(const std::string& handle) const;
Version version;
std::map<std::string, std::string> tags;

View File

@ -29,22 +29,31 @@ Tag::Tag(const Token& token)
}
}
const std::string Tag::Translate(const Directives& directives) {
std::string Tag::Translate(const Directives& directives) {
std::string result;
switch (type) {
case VERBATIM:
return value;
result = value;
break;
case PRIMARY_HANDLE:
return directives.TranslateTagHandle("!") + value;
result = directives.TranslateTagHandle("!") + value;
break;
case SECONDARY_HANDLE:
return directives.TranslateTagHandle("!!") + value;
result = directives.TranslateTagHandle("!!") + value;
break;
case NAMED_HANDLE:
return directives.TranslateTagHandle("!" + handle + "!") + value;
result = directives.TranslateTagHandle("!" + handle + "!") + value;
break;
case NON_SPECIFIC:
// TODO:
return "!";
result = "!";
break;
default:
assert(false);
throw std::runtime_error("yaml-cpp: internal error, bad tag type");
}
throw std::runtime_error("yaml-cpp: internal error, bad tag type");
return result;
}
} // namespace YAML

View File

@ -23,7 +23,7 @@ struct Tag {
};
Tag(const Token& token);
const std::string Translate(const Directives& directives);
std::string Translate(const Directives& directives);
TYPE type;
std::string handle, value;