added std::hash for custom string type for use in unordered_map etc

This commit is contained in:
Noel Berry 2021-05-06 20:47:22 -07:00
parent e79ece2db3
commit 6f2cf82b8e
2 changed files with 61 additions and 13 deletions

View File

@ -3,6 +3,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <cstdio> #include <cstdio>
#include <blah/containers/vector.h> #include <blah/containers/vector.h>
#include <functional>
namespace Blah namespace Blah
{ {
@ -37,12 +38,18 @@ namespace Blah
// append cstr // append cstr
Str& operator+=(const char* rhs) { return append(rhs); } Str& operator+=(const char* rhs) { return append(rhs); }
// append char
Str& operator+=(const char& rhs) { return append(rhs); }
// combine string // combine string
Str operator+(const Str& rhs) { Str str; str.append(*this).append(rhs); return str; } Str operator+(const Str& rhs) { Str str; str.append(*this).append(rhs); return str; }
// combine cstr // combine cstr
Str operator+(const char* rhs) { Str str; str.append(*this).append(rhs); return str; } Str operator+(const char* rhs) { Str str; str.append(*this).append(rhs); return str; }
// combine char
Str operator+(const char& rhs) { Str str; str.append(*this).append(rhs); return str; }
// implicit cast to cstr // implicit cast to cstr
operator char* () { return cstr(); } operator char* () { return cstr(); }
@ -244,3 +251,40 @@ namespace Blah
return str; return str;
} }
} }
namespace std
{
template <>
struct hash<Blah::Str>
{
std::size_t operator()(const Blah::Str& key) const
{
std::size_t result = 2166136261U;
for (auto& it : key)
{
result ^= static_cast<size_t>(it);
result *= 16777619U;
}
return result;
}
};
template <int T>
struct hash<Blah::StrOf<T>>
{
std::size_t operator()(const Blah::StrOf<T>& key) const
{
std::size_t result = 2166136261U;
for (auto& it : key)
{
result ^= static_cast<size_t>(it);
result *= 16777619U;
}
return result;
}
};
}

View File

@ -244,6 +244,8 @@ Str& Str::append_utf16(const u16* start, const u16* end, bool swap_endian)
Str& Str::trim() Str& Str::trim()
{ {
if (m_length > 0)
{
const char* s = begin(); const char* s = begin();
const char* e = end() - 1; const char* e = end() - 1;
@ -253,6 +255,8 @@ Str& Str::trim()
e--; e--;
set(s, e + 1); set(s, e + 1);
}
return *this; return *this;
} }