1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
/*
Copyright 2008 David Nolden <david.nolden.kdevelop@art-master.de>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef REPOSITORYMANAGER_H
#define REPOSITORYMANAGER_H
#include "abstractitemrepository.h"
#include "itemrepositoryregistry.h"
namespace KDevelop {
/// This class helps managing the lifetime of a global item repository, and protecting the consistency.
/// Especially it helps doing thread-safe lazy repository-creation.
template <class ItemRepositoryType, bool unloadingEnabled = true, bool lazy = true>
struct RepositoryManager
: public AbstractRepositoryManager
{
public:
///@param shareMutex Option repository from where this repository should take the thread-safety mutex
explicit RepositoryManager(const QString& name,
int version = 1,
AbstractRepositoryManager*(*shareMutex)() = nullptr,
ItemRepositoryRegistry& registry = globalItemRepositoryRegistry()) :
m_name(name)
, m_version(version)
, m_registry(registry)
, m_shareMutex(shareMutex)
{
if (!lazy) {
createRepository();
}
}
~RepositoryManager() override = default;
Q_DISABLE_COPY(RepositoryManager)
ItemRepositoryType * repository() const
{
if (!m_repository) {
createRepository();
}
return static_cast<ItemRepositoryType*>(m_repository);
}
inline ItemRepositoryType* operator->() const
{
return repository();
}
QMutex* repositoryMutex() const override
{
return (*this)->mutex();
}
private:
void createRepository() const
{
if (!m_repository) {
QMutexLocker lock(&m_registry.mutex());
if (!m_repository) {
m_repository =
new ItemRepositoryType(m_name, &m_registry, m_version, const_cast<RepositoryManager*>(this));
if (m_shareMutex) {
(*this)->setMutex(m_shareMutex()->repositoryMutex());
}
(*this)->setUnloadingEnabled(unloadingEnabled);
}
}
}
QString m_name;
int m_version;
ItemRepositoryRegistry& m_registry;
AbstractRepositoryManager* (* m_shareMutex)();
};
}
#endif // REPOSITORYMANAGER_H
|