From d75685e69f9a5d3cfc255aa921005fc40ae6e585 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sun, 26 Aug 2018 22:13:50 -0400 Subject: Interned tokens to reduce memory footprint --- identifier.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 identifier.h (limited to 'identifier.h') diff --git a/identifier.h b/identifier.h new file mode 100644 index 0000000..74d83ce --- /dev/null +++ b/identifier.h @@ -0,0 +1,59 @@ +#ifndef IDENTIFIER_H_D7EE5679 +#define IDENTIFIER_H_D7EE5679 + +#include +#include + +template +class identifier { +public: + + using value_type = T; + +private: + + using vector_type = std::vector; + +public: + + using key_type = typename vector_type::size_type; + + key_type add(const value_type& val) + { + auto it = ids_.find(val); + + if (it == std::end(ids_)) + { + key_type ret = ids_.size(); + ids_[val] = ret; + + uniq_.push_back(val); + + return ret; + } else { + return it->second; + } + } + + void compile() + { + ids_.clear(); + } + + inline const value_type& get(key_type i) const + { + return uniq_.at(i); + } + + inline key_type size() const + { + return uniq_.size(); + } + +private: + + std::map ids_; + vector_type uniq_; +}; + +#endif /* end of include guard: IDENTIFIER_H_D7EE5679 */ -- cgit 1.4.1