#ifndef IDENTIFIER_H_D7EE5679 #define IDENTIFIER_H_D7EE5679 #include #include template class DefaultKeyExtract { public: const T& operator()(const T& val) const { return val; } }; template > class identifier { public: using value_type = T; private: using key_type = std::remove_reference_t>; using vector_type = std::vector; public: using id_type = typename vector_type::size_type; id_type add(const value_type& val) { auto it = ids_.find(KeyExtract()(val)); if (it == std::end(ids_)) { id_type ret = ids_.size(); ids_[KeyExtract()(val)] = ret; uniq_.push_back(val); return ret; } else { return it->second; } } void compile() { ids_.clear(); } inline const value_type& get(id_type i) const { return uniq_.at(i); } inline id_type size() const { return uniq_.size(); } private: std::map ids_; vector_type uniq_; }; #endif /* end of include guard: IDENTIFIER_H_D7EE5679 */