summaryrefslogtreecommitdiffstats
path: root/source/core/slang-string-slice-pool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/slang-string-slice-pool.cpp')
-rw-r--r--source/core/slang-string-slice-pool.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/source/core/slang-string-slice-pool.cpp b/source/core/slang-string-slice-pool.cpp
new file mode 100644
index 000000000..88963d68f
--- /dev/null
+++ b/source/core/slang-string-slice-pool.cpp
@@ -0,0 +1,43 @@
+#include "slang-string-slice-pool.h"
+
+namespace Slang {
+
+StringSlicePool::StringSlicePool() :
+ m_arena(1024)
+{
+ clear();
+}
+
+void StringSlicePool::clear()
+{
+ m_slices.SetSize(1);
+ m_slices[0] = UnownedStringSlice::fromLiteral("");
+
+ m_map.Clear();
+}
+
+StringSlicePool::Handle StringSlicePool::add(const Slice& slice)
+{
+ const int* indexPtr = m_map.TryGetValue(slice);
+ if (indexPtr)
+ {
+ return Handle(*indexPtr);
+ }
+
+ // Create a scoped copy
+ UnownedStringSlice scopePath(m_arena.allocateString(slice.begin(), slice.size()), slice.size());
+
+ const int index = int(m_slices.Count());
+
+ m_slices.Add(scopePath);
+ m_map.Add(scopePath, index);
+ return Handle(index);
+}
+
+int StringSlicePool::findIndex(const Slice& slice) const
+{
+ const int* index = m_map.TryGetValue(slice);
+ return index ? *index : -1;
+
+}
+} // namespace Slang