From ce5bf0045dccd775757b29b3305d149271467f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E8=8A=B7=E9=85=B1=E7=B4=AB?= Date: Tue, 3 Mar 2026 20:15:31 +0800 Subject: [PATCH] Unify character type handling across platforms --- ZACLib/ZACLib.cpp | 16 +++++++------- ZACLib/ZACLib_Types.hpp | 31 ++++++++++++++++---------- ZACLib/ZACLib_single.hpp | 47 +++++++++++++++++++++++----------------- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/ZACLib/ZACLib.cpp b/ZACLib/ZACLib.cpp index ae457c4..1d05f44 100644 --- a/ZACLib/ZACLib.cpp +++ b/ZACLib/ZACLib.cpp @@ -20,7 +20,7 @@ namespace ZACLib { if (from.empty()) return; if (from.size() > max_rule_len) max_rule_len = from.size(); int node = 0; - for (const char i : from) { + for (const ZAC_CHAR i : from) { const auto c = static_cast(i); if (trie[node].next[c] == -1) { trie[node].next[c] = trie.size(); // NOLINT(*-narrowing-conversions) @@ -32,7 +32,7 @@ namespace ZACLib { if (from.size() > trie[node].match_len) { trie[node].output_id = outputs.size(); // NOLINT(*-narrowing-conversions) trie[node].match_len = from.size(); - outputs.emplace_back(to.data(), to.size()); + outputs.emplace_back(reinterpret_cast(to.data()), to.size()); } } @@ -82,7 +82,7 @@ namespace ZACLib { if (input.empty()) return result; if (max_rule_len == 0) { - result.append(input.data(), input.size()); + result.append(reinterpret_cast(input.data()), input.size()); return result; } @@ -130,7 +130,7 @@ namespace ZACLib { continue; } - result.append(input.data() + last_pos, cursor - last_pos); + result.append(reinterpret_cast(input.data() + last_pos), cursor - last_pos); result.append(outputs[best_output]); cursor += best_len; last_pos = cursor; @@ -138,7 +138,7 @@ namespace ZACLib { }; for (size_t i = 0; i < input.size(); ++i) { - const unsigned char c = input[i]; + const auto c = static_cast(input[i]); state = trie[state].next[c]; if (trie[state].output_id != invalid_output) { @@ -154,7 +154,7 @@ namespace ZACLib { emit_until(input.size()); if (last_pos < input.size()) { - result.append(input.data() + last_pos, input.size() - last_pos); + result.append(reinterpret_cast(input.data() + last_pos), input.size() - last_pos); } return result; @@ -168,7 +168,7 @@ namespace ZACLib { void Search::AddRule(const ZAC_SV& from) { if (from.empty()) return; int node = 0; - for (const char i : from) { + for (const ZAC_CHAR i : from) { const auto c = static_cast(i); if (trie[node].next[c] == -1) { trie[node].next[c] = trie.size(); // NOLINT(*-narrowing-conversions) @@ -180,7 +180,7 @@ namespace ZACLib { if (from.size() > trie[node].match_len) { trie[node].output_id = outputs.size(); // NOLINT(*-narrowing-conversions) trie[node].match_len = from.size(); - outputs.emplace_back(from.data(), from.size()); + outputs.emplace_back(reinterpret_cast(from.data()), from.size()); } } diff --git a/ZACLib/ZACLib_Types.hpp b/ZACLib/ZACLib_Types.hpp index ca00e36..db8fbc4 100644 --- a/ZACLib/ZACLib_Types.hpp +++ b/ZACLib/ZACLib_Types.hpp @@ -16,28 +16,35 @@ #include #include +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) +using ZAC_CHAR = unsigned char; +#else +using ZAC_CHAR = char; +#endif + namespace ZACLib { #if __cplusplus >= 201703L - using ZAC_SV = std::string_view; + using ZAC_SV = std::basic_string_view; #else class ZAC_SV { - const char* m_data; + const ZAC_CHAR* m_data; const size_t m_size; public: ZAC_SV() : m_data(nullptr), m_size(0) {} - ZAC_SV(const char* d, const size_t s) : m_data(d), + ZAC_SV(const ZAC_CHAR* d, const size_t s) : m_data(d), m_size(s) {} - ZAC_SV(const std::string& s) : m_data(s.c_str()), + // ReSharper disable once CppRedundantCastExpression + ZAC_SV(const std::string& s) : m_data(reinterpret_cast(s.c_str())), m_size(s.size()) {} // 模仿std::string_view,不禁止隐式构造 - ZAC_SV(const char* d) : m_data(d), - m_size(d ? std::strlen(d) : 0) {} // 模仿std::string_view,不禁止隐式构造 + ZAC_SV(const ZAC_CHAR* d) : m_data(d), + m_size(d ? std::strlen(reinterpret_cast(d)) : 0) {} // 模仿std::string_view,不禁止隐式构造 - const char* data() const noexcept { + const ZAC_CHAR* data() const noexcept { return m_data; } @@ -49,12 +56,12 @@ namespace ZACLib { return m_size == 0; } - const char* begin() const { return m_data; } - const char* end() const { return m_data + m_size; } - const char* cbegin() const { return m_data; } - const char* cend() const { return m_data + m_size; } + const ZAC_CHAR* begin() const { return m_data; } + const ZAC_CHAR* end() const { return m_data + m_size; } + const ZAC_CHAR* cbegin() const { return m_data; } + const ZAC_CHAR* cend() const { return m_data + m_size; } - const char& operator[](const size_t i) const { return m_data[i]; } + const ZAC_CHAR& operator[](const size_t i) const { return m_data[i]; } }; #endif diff --git a/ZACLib/ZACLib_single.hpp b/ZACLib/ZACLib_single.hpp index 2592784..e2fd4df 100644 --- a/ZACLib/ZACLib_single.hpp +++ b/ZACLib/ZACLib_single.hpp @@ -31,29 +31,36 @@ #include #include +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) +using ZAC_CHAR = unsigned char; +#else +using ZAC_CHAR = char; +#endif + namespace ZACLib { #if __cplusplus >= 201703L - using ZAC_SV = std::string_view; + using ZAC_SV = std::basic_string_view; #else class ZAC_SV { - const char* m_data; + const ZAC_CHAR* m_data; const size_t m_size; public: ZAC_SV() : m_data(nullptr), m_size(0) {} - ZAC_SV(const char* d, const size_t s) : m_data(d), + ZAC_SV(const ZAC_CHAR* d, const size_t s) : m_data(d), m_size(s) {} - ZAC_SV(const std::string& s) : m_data(s.c_str()), + // ReSharper disable once CppRedundantCastExpression + ZAC_SV(const std::string& s) : m_data(reinterpret_cast(s.c_str())), m_size(s.size()) {} // 模仿std::string_view,不禁止隐式构造 - ZAC_SV(const char* d) : m_data(d), - m_size(d ? std::strlen(d) : 0) {} // 模仿std::string_view,不禁止隐式构造 + ZAC_SV(const ZAC_CHAR* d) : m_data(d), + m_size(d ? std::strlen(reinterpret_cast(d)) : 0) {} // 模仿std::string_view,不禁止隐式构造 - const char* data() const noexcept { + const ZAC_CHAR* data() const noexcept { return m_data; } @@ -65,12 +72,12 @@ namespace ZACLib { return m_size == 0; } - const char* begin() const { return m_data; } - const char* end() const { return m_data + m_size; } - const char* cbegin() const { return m_data; } - const char* cend() const { return m_data + m_size; } + const ZAC_CHAR* begin() const { return m_data; } + const ZAC_CHAR* end() const { return m_data + m_size; } + const ZAC_CHAR* cbegin() const { return m_data; } + const ZAC_CHAR* cend() const { return m_data + m_size; } - const char& operator[](const size_t i) const { return m_data[i]; } + const ZAC_CHAR& operator[](const size_t i) const { return m_data[i]; } }; #endif @@ -105,7 +112,7 @@ namespace ZACLib { if (from.empty()) return; if (from.size() > max_rule_len) max_rule_len = from.size(); int node = 0; - for (const char i : from) { + for (const ZAC_CHAR i : from) { const auto c = static_cast(i); if (trie[node].next[c] == -1) { trie[node].next[c] = trie.size(); // NOLINT(*-narrowing-conversions) @@ -116,7 +123,7 @@ namespace ZACLib { if (from.size() > trie[node].match_len) { trie[node].output_id = outputs.size(); // NOLINT(*-narrowing-conversions) trie[node].match_len = from.size(); - outputs.emplace_back(to.data(), to.size()); + outputs.emplace_back(reinterpret_cast(to.data()), to.size()); } } @@ -158,7 +165,7 @@ namespace ZACLib { if (input.empty()) return result; if (max_rule_len == 0) { - result.append(input.data(), input.size()); + result.append(reinterpret_cast(input.data()), input.size()); return result; } @@ -206,7 +213,7 @@ namespace ZACLib { continue; } - result.append(input.data() + last_pos, cursor - last_pos); + result.append(reinterpret_cast(input.data() + last_pos), cursor - last_pos); result.append(outputs[best_output]); cursor += best_len; last_pos = cursor; @@ -214,7 +221,7 @@ namespace ZACLib { }; for (size_t i = 0; i < input.size(); ++i) { - const unsigned char c = input[i]; + const auto c = static_cast(input[i]); state = trie[state].next[c]; if (trie[state].output_id != invalid_output) { @@ -230,7 +237,7 @@ namespace ZACLib { emit_until(input.size()); if (last_pos < input.size()) { - result.append(input.data() + last_pos, input.size() - last_pos); + result.append(reinterpret_cast(input.data() + last_pos), input.size() - last_pos); } return result; @@ -255,7 +262,7 @@ namespace ZACLib { void AddRule(const ZAC_SV& from) { if (from.empty()) return; int node = 0; - for (const char i : from) { + for (const ZAC_CHAR i : from) { const auto c = static_cast(i); if (trie[node].next[c] == -1) { trie[node].next[c] = trie.size(); // NOLINT(*-narrowing-conversions) @@ -266,7 +273,7 @@ namespace ZACLib { if (from.size() > trie[node].match_len) { trie[node].output_id = outputs.size(); // NOLINT(*-narrowing-conversions) trie[node].match_len = from.size(); - outputs.emplace_back(from.data(), from.size()); + outputs.emplace_back(reinterpret_cast(from.data()), from.size()); } }