diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-01-15 13:54:38 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-01-15 19:26:38 +0000 |
| commit | 76d806e98d5e80f7f0c233d561371b89b8724c23 (patch) | |
| tree | fa93543d091e89045c04766ce7854d3f125ab3dd /src/shared_string.cc | |
| parent | 2a878d51fdfe5832a3b979dbc8e5b2144ad0d1f3 (diff) | |
Replace InternedStrings with SharedString, shared_ptr based
Diffstat (limited to 'src/shared_string.cc')
| -rw-r--r-- | src/shared_string.cc | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/shared_string.cc b/src/shared_string.cc new file mode 100644 index 00000000..d98affe9 --- /dev/null +++ b/src/shared_string.cc @@ -0,0 +1,45 @@ +#include "shared_string.hh" +#include "debug.hh" + +namespace Kakoune +{ + +SharedString StringRegistry::intern(StringView str) +{ + auto it = m_strings.find(str); + if (it == m_strings.end()) + { + SharedString shared_str = str; + it = m_strings.emplace(StringView{shared_str}, shared_str.m_storage).first; + } + return {*it->second, it->second}; +} + +void StringRegistry::purge_unused() +{ + for (auto it = m_strings.begin(); it != m_strings.end(); ) + { + if (it->second.unique()) + it = m_strings.erase(it); + else + ++it; + } +} + +void StringRegistry::debug_stats() const +{ + + write_debug("Shared Strings stats:"); + size_t total_refcount = 0; + size_t total_size = 0; + size_t count = m_strings.size(); + for (auto& st : m_strings) + { + total_refcount += st.second.use_count() - 1; + total_size += (int)st.second->length(); + } + write_debug(" data size: " + to_string(total_size) + ", mean: " + to_string((float)total_size/count)); + write_debug(" refcounts: " + to_string(total_refcount) + ", mean: " + to_string((float)total_refcount/count)); +} + +} |
