#ifndef WTF_SymbolRegistry_h
#define WTF_SymbolRegistry_h
#include <wtf/HashSet.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/SymbolImpl.h>
#include <wtf/text/WTFString.h>
namespace WTF {
class SymbolRegistryKey {
public:
SymbolRegistryKey() = default;
explicit SymbolRegistryKey(StringImpl* uid);
SymbolRegistryKey(WTF::HashTableDeletedValueType);
unsigned hash() const { return m_hash; }
StringImpl* impl() const { return m_impl; }
bool isHashTableDeletedValue() const { return m_impl == hashTableDeletedValue(); }
private:
static StringImpl* hashTableDeletedValue() { return reinterpret_cast<StringImpl*>(-1); }
StringImpl* m_impl { nullptr };
unsigned m_hash { 0 };
};
template<typename T> struct DefaultHash;
template<> struct DefaultHash<SymbolRegistryKey> {
struct Hash : StringHash {
static unsigned hash(const SymbolRegistryKey& key)
{
return key.hash();
}
static bool equal(const SymbolRegistryKey& a, const SymbolRegistryKey& b)
{
return StringHash::equal(a.impl(), b.impl());
}
};
};
template<> struct HashTraits<SymbolRegistryKey> : SimpleClassHashTraits<SymbolRegistryKey> {
static const bool hasIsEmptyValueFunction = true;
static bool isEmptyValue(const SymbolRegistryKey& key)
{
return key.impl() == nullptr;
}
};
class SymbolRegistry {
WTF_MAKE_NONCOPYABLE(SymbolRegistry);
public:
SymbolRegistry() = default;
WTF_EXPORT_PRIVATE ~SymbolRegistry();
WTF_EXPORT_PRIVATE Ref<SymbolImpl> symbolForKey(const String&);
WTF_EXPORT_PRIVATE String keyForSymbol(SymbolImpl&);
void remove(SymbolImpl&);
private:
HashSet<SymbolRegistryKey> m_table;
};
inline SymbolRegistryKey::SymbolRegistryKey(StringImpl* uid)
: m_impl(uid)
{
if (uid->isSymbol()) {
if (uid->is8Bit())
m_hash = StringHasher::computeHashAndMaskTop8Bits(uid->characters8(), uid->length());
else
m_hash = StringHasher::computeHashAndMaskTop8Bits(uid->characters16(), uid->length());
} else
m_hash = uid->hash();
}
inline SymbolRegistryKey::SymbolRegistryKey(WTF::HashTableDeletedValueType)
: m_impl(hashTableDeletedValue())
{
}
}
#endif