Fixes for StringView to make working with non-null terminated strings easier
continuous-integration/drone/push Build is failing Details

This commit is contained in:
Deukhoofd 2022-04-26 11:19:59 +02:00
parent 70e30833bb
commit 30cb3c0d5e
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
2 changed files with 19 additions and 18 deletions

View File

@ -22,7 +22,8 @@ namespace ArbUt {
public: public:
__ConstStringCharHolder(const char* non_null value, size_t length) : _value(new char[length + 1]) { __ConstStringCharHolder(const char* non_null value, size_t length) : _value(new char[length + 1]) {
EnsureNotNull(value); EnsureNotNull(value);
strncpy(_value, value, length + 1); strncpy(_value, value, length);
_value[length] = 0;
} }
~__ConstStringCharHolder() noexcept { delete[] _value; } ~__ConstStringCharHolder() noexcept { delete[] _value; }
inline constexpr const char* non_null GetValue() const noexcept { return _value; } inline constexpr const char* non_null GetValue() const noexcept { return _value; }
@ -61,10 +62,10 @@ constexpr u32 crc_table[256] = {
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D}; 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D};
inline static constexpr char charToLower(const char c) { return (c >= 'A' && c <= 'Z') ? c + ('a' - 'A') : c; } inline static constexpr char charToLower(const char c) { return (c >= 'A' && c <= 'Z') ? c + ('a' - 'A') : c; }
static u32 constexpr Hash(std::string_view input) { static u32 constexpr Hash(const char* non_null str, size_t size) {
u32 crc = 0xffffffff; u32 crc = 0xffffffff;
for (auto c : input) { for (size_t i = 0; i < size; ++i) {
crc = (crc >> 8) ^ crc_table[(crc ^ charToLower(c)) & 0xff]; crc = (crc >> 8) ^ crc_table[(crc ^ charToLower(str[i])) & 0xff];
} }
return crc ^ 0xffffffff; return crc ^ 0xffffffff;
}; };
@ -84,13 +85,13 @@ namespace ArbUt {
/// @brief Instantiate a StringView using a C string. /// @brief Instantiate a StringView using a C string.
/// @param str A null-terminated C string. /// @param str A null-terminated C string.
StringView(const char* non_null str) StringView(const char* non_null str)
: BasicStringView(CalcLength(str), Hash(str)), _str(new __ConstStringCharHolder(str, CalcLength(str))) {} : BasicStringView(CalcLength(str), Hash(str, CalcLength(str))), _str(new __ConstStringCharHolder(str, CalcLength(str))) {}
/// @brief Instantiate a StringView using a C string, as well as it's length. /// @brief Instantiate a StringView using a C string, as well as it's length.
/// @param str A null-terminated C string. /// @param str A null-terminated C string.
/// @param length The length of the C string /// @param length The length of the C string
StringView(const char* non_null str, size_t length) StringView(const char* non_null str, size_t length)
: BasicStringView(length, Hash(str)), _str(new __ConstStringCharHolder(str, length)) {} : BasicStringView(length, Hash(str, length)), _str(new __ConstStringCharHolder(str, length)) {}
StringView() noexcept : BasicStringView(0, Hash("")) {} StringView() noexcept : BasicStringView(0, Hash("", 0)) {}
/* Copy operators */ /* Copy operators */
/// @brief Copy operator /// @brief Copy operator
@ -126,29 +127,29 @@ namespace ArbUt {
/// @brief Check equality with standard C++ string. /// @brief Check equality with standard C++ string.
inline constexpr bool operator==(const std::string_view& rhs) const noexcept final { inline constexpr bool operator==(const std::string_view& rhs) const noexcept final {
return _hash == Hash(rhs.data()); return _hash == Hash(rhs.data(), rhs.size());
} }
/// @brief Check inequality with standard C++ string. /// @brief Check inequality with standard C++ string.
inline constexpr bool operator!=(const std::string_view& rhs) const noexcept final { inline constexpr bool operator!=(const std::string_view& rhs) const noexcept final {
return _hash != Hash(rhs.data()); return _hash != Hash(rhs.data(), rhs.size());
} }
/// @brief Check equality with standard C style string. /// @brief Check equality with standard C style string.
inline constexpr bool operator==(const char* non_null rhs) const noexcept final { return _hash == Hash(rhs); } inline constexpr bool operator==(const char* non_null rhs) const noexcept final { return _hash == Hash(rhs, CalcLength(rhs)); }
/// @brief Check inequality with standard C style string. /// @brief Check inequality with standard C style string.
inline constexpr bool operator!=(const char* non_null rhs) const noexcept final { return _hash != Hash(rhs); } inline constexpr bool operator!=(const char* non_null rhs) const noexcept final { return _hash != Hash(rhs, CalcLength(rhs)); }
/// @brief Calculates the hash for a given C string. /// @brief Calculates the hash for a given C string.
/// @param val A null-terminated C string. /// @param val A null-terminated C string.
/// @return A hash of the given string. /// @return A hash of the given string.
[[maybe_unused]] [[nodiscard]] inline static constexpr u32 CalculateHash(const char* non_null val) noexcept { [[maybe_unused]] [[nodiscard]] inline static constexpr u32 CalculateHash(const char* non_null val) noexcept {
return Hash(val); return Hash(val, CalcLength(val));
} }
/// @brief Calculates the hash for a given std string. /// @brief Calculates the hash for a given std string.
/// @param val A std string. /// @param val A std string.
/// @return A hash of the given string. /// @return A hash of the given string.
[[maybe_unused]] [[nodiscard]] inline static constexpr u32 CalculateHash(const std::string_view& val) noexcept { [[maybe_unused]] [[nodiscard]] inline static constexpr u32 CalculateHash(const std::string_view& val) noexcept {
return Hash(val.data()); return Hash(val.data(), val.size());
} }
/// @brief Returns an empty string. /// @brief Returns an empty string.

View File

@ -16,7 +16,7 @@ namespace ArbUt {
/// @param str A null terminated C string. /// @param str A null terminated C string.
/// @param size A The length of the string. /// @param size A The length of the string.
constexpr StringViewLiteral(const char* non_null str, size_t size) noexcept constexpr StringViewLiteral(const char* non_null str, size_t size) noexcept
: BasicStringView(size, Hash(str)), _str(str) {} : BasicStringView(size, Hash(str, size)), _str(str) {}
/// @brief Compile time initialisation of a StringViewLiteral. Length is calculated at compile. /// @brief Compile time initialisation of a StringViewLiteral. Length is calculated at compile.
/// @param str A null terminated C string. /// @param str A null terminated C string.
constexpr StringViewLiteral(const char* non_null str) noexcept : StringViewLiteral(str, CalcLength(str)){}; constexpr StringViewLiteral(const char* non_null str) noexcept : StringViewLiteral(str, CalcLength(str)){};
@ -34,16 +34,16 @@ namespace ArbUt {
/// @brief Check equality with standard C++ string. /// @brief Check equality with standard C++ string.
inline constexpr bool operator==(const std::string_view& rhs) const noexcept final { inline constexpr bool operator==(const std::string_view& rhs) const noexcept final {
return _hash == Hash(rhs.data()); return _hash == Hash(rhs.data(), rhs.size());
} }
/// @brief Check inequality with standard C++ string. /// @brief Check inequality with standard C++ string.
inline constexpr bool operator!=(const std::string_view& rhs) const noexcept final { inline constexpr bool operator!=(const std::string_view& rhs) const noexcept final {
return _hash != Hash(rhs.data()); return _hash != Hash(rhs.data(), rhs.size());
} }
/// @brief Check equality with standard C style string. /// @brief Check equality with standard C style string.
inline constexpr bool operator==(const char* non_null rhs) const noexcept final { return _hash == Hash(rhs); } inline constexpr bool operator==(const char* non_null rhs) const noexcept final { return _hash == Hash(rhs, CalcLength(rhs)); }
/// @brief Check inequality with standard C style string. /// @brief Check inequality with standard C style string.
inline constexpr bool operator!=(const char* non_null rhs) const noexcept final { return _hash != Hash(rhs); } inline constexpr bool operator!=(const char* non_null rhs) const noexcept final { return _hash != Hash(rhs, CalcLength(rhs)); }
}; };
} }