#pragma once #ifndef MESSMER_FSPP_IMPL_IDLIST_H_ #define MESSMER_FSPP_IMPL_IDLIST_H_ #include #include #include #include namespace fspp { template class IdList final { public: IdList(); virtual ~IdList(); int add(cpputils::unique_ref entry); Entry *get(int id); const Entry *get(int id) const; void remove(int id); private: std::map> _entries; int _id_counter; mutable std::mutex _mutex; DISALLOW_COPY_AND_ASSIGN(IdList); }; template IdList::IdList() : _entries(), _id_counter(0), _mutex() { } template IdList::~IdList() { } template int IdList::add(cpputils::unique_ref entry) { std::lock_guard lock(_mutex); //TODO Reuse IDs (ids = descriptors) int new_id = ++_id_counter; _entries.insert(std::make_pair(new_id, std::move(entry))); return new_id; } template Entry *IdList::get(int id) { return const_cast(const_cast*>(this)->get(id)); } template const Entry *IdList::get(int id) const { std::lock_guard lock(_mutex); const Entry *result = _entries.at(id).get(); return result; } template void IdList::remove(int id) { std::lock_guard lock(_mutex); auto found_iter = _entries.find(id); if (found_iter == _entries.end()) { throw std::out_of_range("Called IdList::remove() with an invalid ID"); } _entries.erase(found_iter); } } #endif