Chris@1729: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@1729: Chris@1729: /* Chris@1729: Sonic Visualiser Chris@1729: An audio file viewer and annotation editor. Chris@1729: Centre for Digital Music, Queen Mary, University of London. Chris@1729: Chris@1729: This program is free software; you can redistribute it and/or Chris@1729: modify it under the terms of the GNU General Public License as Chris@1729: published by the Free Software Foundation; either version 2 of the Chris@1729: License, or (at your option) any later version. See the file Chris@1729: COPYING included with this distribution for more information. Chris@1729: */ Chris@1729: Chris@1729: #ifndef SV_BY_ID_H Chris@1729: #define SV_BY_ID_H Chris@1729: Chris@1729: #include Chris@1729: #include Chris@1729: Chris@1729: #include Chris@1729: Chris@1729: typedef int Id; Chris@1729: Chris@1729: class WithId Chris@1729: { Chris@1729: public: Chris@1729: WithId() : Chris@1729: m_id(getNextId()) { Chris@1729: } Chris@1729: Chris@1729: Id getId() const { Chris@1729: return m_id; Chris@1729: } Chris@1729: Chris@1729: private: Chris@1729: Id m_id; Chris@1729: static int getNextId(); Chris@1729: }; Chris@1729: Chris@1729: template Chris@1729: class ById Chris@1729: { Chris@1729: public: Chris@1729: void add(std::shared_ptr item) { Chris@1729: QMutexLocker locker(&m_mutex); Chris@1729: m_items[item->getId()] = item; Chris@1729: } Chris@1729: Chris@1729: void Chris@1729: release(Id id) { Chris@1729: QMutexLocker locker(&m_mutex); Chris@1729: m_items.erase(id); Chris@1729: } Chris@1729: Chris@1729: std::shared_ptr get(Id id) const { Chris@1729: QMutexLocker locker(&m_mutex); Chris@1729: const auto &itr = m_items.find(id); Chris@1729: if (itr != m_items.end()) { Chris@1729: return itr->second; Chris@1729: } else { Chris@1729: return std::shared_ptr(); Chris@1729: } Chris@1729: } Chris@1729: Chris@1729: template Chris@1729: std::shared_ptr getAs(Id id) const { Chris@1729: return std::dynamic_pointer_cast(get(id)); Chris@1729: } Chris@1729: Chris@1729: private: Chris@1729: mutable QMutex m_mutex; Chris@1729: std::map> m_items; Chris@1729: }; Chris@1729: /* Chris@1729: class Imagined : public WithId { Chris@1729: }; Chris@1729: Chris@1729: class ImaginedById Chris@1729: { Chris@1729: public: Chris@1729: static void add(std::shared_ptr imagined) { Chris@1729: m_byId.add(imagined); Chris@1729: } Chris@1729: Chris@1729: static void release(Id id) { Chris@1729: m_byId.release(id); Chris@1729: } Chris@1729: Chris@1729: static std::shared_ptr get(Id id) { Chris@1729: return m_byId.get(id); Chris@1729: } Chris@1729: Chris@1729: template Chris@1729: static Chris@1729: std::shared_ptr getAs(Id id) { Chris@1729: return m_byId.getAs(id); Chris@1729: } Chris@1729: Chris@1729: private: Chris@1729: static ById m_byId; Chris@1729: }; Chris@1729: */ Chris@1729: #endif Chris@1729: