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..774027f 100644 --- a/ZACLib/ZACLib_Types.hpp +++ b/ZACLib/ZACLib_Types.hpp @@ -16,28 +16,63 @@ #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; + class ZAC_SV : public std::basic_string_view { + public: + using std::basic_string_view::basic_string_view; + ZAC_SV() = default; + + // ReSharper disable once CppRedundantCastExpression + ZAC_SV(const std::string& s) noexcept + : std::basic_string_view(reinterpret_cast(s.data()), s.size()) {} + +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* s, const size_t n) + : std::basic_string_view(reinterpret_cast(s), n) {} + + ZAC_SV(const char* s) + : std::basic_string_view( + reinterpret_cast(s), + s ? std::char_traits::length(s) : 0) {} +#endif + }; #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()), +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* d, const size_t s) : m_data(reinterpret_cast(d)), + m_size(s) {} +#endif + + // 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,不禁止隐式构造 + +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* d) : m_data(reinterpret_cast(d)), + m_size(d ? std::strlen(d) : 0) {} +#endif - const char* data() const noexcept { + const ZAC_CHAR* data() const noexcept { return m_data; } @@ -49,12 +84,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..5b7ce3c 100644 --- a/ZACLib/ZACLib_single.hpp +++ b/ZACLib/ZACLib_single.hpp @@ -31,29 +31,64 @@ #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; + class ZAC_SV : public std::basic_string_view { + public: + using std::basic_string_view::basic_string_view; + ZAC_SV() = default; + + // ReSharper disable once CppRedundantCastExpression + ZAC_SV(const std::string& s) noexcept + : std::basic_string_view(reinterpret_cast(s.data()), s.size()) {} + +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* s, const size_t n) + : std::basic_string_view(reinterpret_cast(s), n) {} + + ZAC_SV(const char* s) + : std::basic_string_view( + reinterpret_cast(s), + s ? std::char_traits::length(s) : 0) {} +#endif + }; #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) {} + +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* d, const size_t s) : m_data(reinterpret_cast(d)), m_size(s) {} +#endif - 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 { +#if defined(__ANDROID__) || defined(__arm__) || defined(__aarch64__) + ZAC_SV(const char* d) : m_data(reinterpret_cast(d)), + m_size(d ? std::strlen(d) : 0) {} +#endif + + const ZAC_CHAR* data() const noexcept { return m_data; } @@ -65,12 +100,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 +140,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 +151,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 +193,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 +241,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 +249,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 +265,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 +290,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 +301,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()); } }