From 64f0b85dcf0aa1b12124d6f02d917a93d0ecb752 Mon Sep 17 00:00:00 2001 From: Dennis Date: Fri, 31 May 2024 15:58:34 +0200 Subject: [PATCH] Use Lemire's fast check whether to escape a JSON string --- include/util/string_util.hpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/include/util/string_util.hpp b/include/util/string_util.hpp index 874a1d284..00948a14c 100644 --- a/include/util/string_util.hpp +++ b/include/util/string_util.hpp @@ -10,26 +10,30 @@ namespace osrm::util { +// implements Lemire's table-based escape needs check +// cf. https://lemire.me/blog/2024/05/31/quickly-checking-whether-a-string-needs-escaping/ +inline static constexpr std::array json_quotable_character = []() constexpr +{ + std::array result{}; + for (size_t i = 0; i < 32; i++) + { + result[i] = 1; + } + for (size_t i : {'"', '\\'}) + { + result[i] = 1; + } + return result; +}(); + inline bool RequiresJSONStringEscaping(const std::string &string) { - for (const char letter : string) + uint8_t needs = 0; + for (uint8_t c : string) { - switch (letter) - { - case '\\': - case '"': - case '/': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - return true; - default: - continue; - } + needs |= json_quotable_character[c]; } - return false; + return needs; } inline void EscapeJSONString(const std::string &input, std::string &output)