summaryrefslogtreecommitdiff
path: root/src/generic/intern-pool.hpp
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-03-15 19:34:59 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-03-16 18:58:48 -0700
commitc812c92d1a1835f0bda783e709481188c8d92225 (patch)
treeb401ede48a088ad1aaed88fe3b997cd26ff7ae08 /src/generic/intern-pool.hpp
parentde9ee1b9754af9d954487121947352f32d7ebb7e (diff)
downloadtmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.gz
tmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.bz2
tmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.xz
tmwa-c812c92d1a1835f0bda783e709481188c8d92225.zip
Clean up header organization
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