summaryrefslogtreecommitdiff
path: root/src/generic/intern-pool.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/generic/intern-pool.hpp')
-rw-r--r--src/generic/intern-pool.hpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/generic/intern-pool.hpp b/src/generic/intern-pool.hpp
new file mode 100644
index 0000000..69f20ef
--- /dev/null
+++ b/src/generic/intern-pool.hpp
@@ -0,0 +1,41 @@
+#ifndef TMWA_GENERIC_INTERN_POOL_HPP
+#define TMWA_GENERIC_INTERN_POOL_HPP
+
+# include <cassert>
+
+# include <map>
+# include <vector>
+
+# include "../strings/rstring.hpp"
+# include "../strings/zstring.hpp"
+# include "../strings/xstring.hpp"
+
+class InternPool
+{
+ std::map<RString, size_t> known;
+ std::vector<RString> names;
+public:
+ size_t intern(XString name_)
+ {
+ // TODO just look up the XString, the memory should not move by now
+ RString name = name_;
+ // hm, I could change this to do aliases
+ auto pair = known.insert({name, known.size()});
+ if (pair.second)
+ names.push_back(name);
+ assert (known.size() == names.size());
+ return pair.first->second;
+ }
+
+ ZString outtern(size_t sz) const
+ {
+ return names[sz];
+ }
+
+ size_t size() const
+ {
+ return known.size();
+ }
+};
+
+#endif // TMWA_GENERIC_INTERN_POOL_HPP