Use uint32_t for interned strings slots
This commit is contained in:
parent
61619a4d4d
commit
118a6e1a7c
|
@ -28,7 +28,7 @@ InternedString StringRegistry::acquire(StringView str)
|
||||||
auto it = m_slot_map.find(str);
|
auto it = m_slot_map.find(str);
|
||||||
if (it == m_slot_map.end())
|
if (it == m_slot_map.end())
|
||||||
{
|
{
|
||||||
size_t slot;
|
Slot slot;
|
||||||
if (not m_free_slots.empty())
|
if (not m_free_slots.empty())
|
||||||
{
|
{
|
||||||
slot = m_free_slots.back();
|
slot = m_free_slots.back();
|
||||||
|
@ -48,20 +48,20 @@ InternedString StringRegistry::acquire(StringView str)
|
||||||
return InternedString{storage_view, slot};
|
return InternedString{storage_view, slot};
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t slot = it->second;
|
Slot slot = it->second;
|
||||||
auto& data = m_storage[slot];
|
auto& data = m_storage[slot];
|
||||||
++data.refcount;
|
++data.refcount;
|
||||||
return {{data.data.data(), (int)data.data.size()}, slot};
|
return {{data.data.data(), (int)data.data.size()}, slot};
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringRegistry::acquire(size_t slot)
|
void StringRegistry::acquire(Slot slot)
|
||||||
{
|
{
|
||||||
kak_assert(slot < m_storage.size());
|
kak_assert(slot < m_storage.size());
|
||||||
kak_assert(m_storage[slot].refcount > 0);
|
kak_assert(m_storage[slot].refcount > 0);
|
||||||
++m_storage[slot].refcount;
|
++m_storage[slot].refcount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringRegistry::release(size_t slot) noexcept
|
void StringRegistry::release(Slot slot) noexcept
|
||||||
{
|
{
|
||||||
kak_assert(m_storage[slot].refcount > 0);
|
kak_assert(m_storage[slot].refcount > 0);
|
||||||
if (--m_storage[slot].refcount == 0)
|
if (--m_storage[slot].refcount == 0)
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
#include "unordered_map.hh"
|
#include "unordered_map.hh"
|
||||||
#include "vector.hh"
|
#include "vector.hh"
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -17,13 +19,14 @@ public:
|
||||||
void debug_stats() const;
|
void debug_stats() const;
|
||||||
private:
|
private:
|
||||||
friend class InternedString;
|
friend class InternedString;
|
||||||
|
using Slot = uint32_t;
|
||||||
|
|
||||||
InternedString acquire(StringView str);
|
InternedString acquire(StringView str);
|
||||||
void acquire(size_t slot);
|
void acquire(Slot slot);
|
||||||
void release(size_t slot) noexcept;
|
void release(Slot slot) noexcept;
|
||||||
|
|
||||||
UnorderedMap<StringView, size_t, MemoryDomain::InternedString> m_slot_map;
|
UnorderedMap<StringView, Slot, MemoryDomain::InternedString> m_slot_map;
|
||||||
Vector<size_t, MemoryDomain::InternedString> m_free_slots;
|
Vector<Slot, MemoryDomain::InternedString> m_free_slots;
|
||||||
struct DataAndRefCount
|
struct DataAndRefCount
|
||||||
{
|
{
|
||||||
Vector<char, MemoryDomain::InternedString> data;
|
Vector<char, MemoryDomain::InternedString> data;
|
||||||
|
@ -101,7 +104,7 @@ public:
|
||||||
private:
|
private:
|
||||||
friend class StringRegistry;
|
friend class StringRegistry;
|
||||||
|
|
||||||
InternedString(StringView str, size_t slot)
|
InternedString(StringView str, StringRegistry::Slot slot)
|
||||||
: StringView(str), m_slot(slot) {}
|
: StringView(str), m_slot(slot) {}
|
||||||
|
|
||||||
void acquire_ifn(StringView str)
|
void acquire_ifn(StringView str)
|
||||||
|
@ -121,7 +124,7 @@ private:
|
||||||
StringRegistry::instance().release(m_slot);
|
StringRegistry::instance().release(m_slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t m_slot = -1;
|
StringRegistry::Slot m_slot = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline size_t hash_value(const Kakoune::InternedString& str)
|
inline size_t hash_value(const Kakoune::InternedString& str)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user