diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-15 19:34:59 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-16 18:58:48 -0700 |
commit | c812c92d1a1835f0bda783e709481188c8d92225 (patch) | |
tree | b401ede48a088ad1aaed88fe3b997cd26ff7ae08 /src/generic/intern-pool.hpp | |
parent | de9ee1b9754af9d954487121947352f32d7ebb7e (diff) | |
download | tmwa-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.hpp | 41 |
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 |