summaryrefslogtreecommitdiff
path: root/src/shared_string.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-01-15 13:54:38 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-01-15 19:26:38 +0000
commit76d806e98d5e80f7f0c233d561371b89b8724c23 (patch)
treefa93543d091e89045c04766ce7854d3f125ab3dd /src/shared_string.cc
parent2a878d51fdfe5832a3b979dbc8e5b2144ad0d1f3 (diff)
Replace InternedStrings with SharedString, shared_ptr based
Diffstat (limited to 'src/shared_string.cc')
-rw-r--r--src/shared_string.cc45
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));
+}
+
+}