// repository_manager.h #ifndef REPOSITORY_MANAGER_H #define REPOSITORY_MANAGER_H #include "repository_interface.h" #include #include // The repository manager inherits the QObject class to delete child objects class RepositoryManager : public QObject { Q_OBJECT private: // Database connection QSqlDatabase database_; // Map of repository names to instances QMap repositories_; public: // Singleton instance accessor static RepositoryManager &instance(); // Get a repository by name RepositoryInterface *getRepository(const QString &repositoryTableName) const; // Get a repository by name and type template T *getRepositoryAs(const QString &repositoryTableName) const; private: // Register a new repository template bool registerRepository(const QString &repositoryTableName); // Initialize repositories void initialize(); // Private constructor for singleton RepositoryManager(); // Destructor to clean up resources ~RepositoryManager(); // Delete copy constructor RepositoryManager(const RepositoryManager &) = delete; // Delete assignment operator RepositoryManager &operator=(const RepositoryManager &) = delete; }; // NOTE: Implementation of template methods template T *RepositoryManager::getRepositoryAs( const QString &repositoryTableName) const { auto *repository = dynamic_cast(getRepository(repositoryTableName)); if (!repository) { qFatal() << "Failed to downcast repository for" << repositoryTableName << "(typeid name):" << typeid(T).name(); return nullptr; } qInfo() << "Successfully downcast repository for" << repositoryTableName; return repository; } template bool RepositoryManager::registerRepository(const QString &repositoryTableName) { static_assert( std::is_constructible::value, "Repository class must have a constructor accepting QSqlDatabase& and " "QObject*"); if (repositories_.contains(repositoryTableName)) { qInfo() << "Repository" << repositoryTableName << "is already registered"; return true; } auto *repository = new T(database_, this); // Qt will delete the model repository->setObjectName(repositoryTableName); repositories_.insert(repositoryTableName, repository); qInfo() << "Repository" << repositoryTableName << "was registered successfully"; return true; } #endif // REPOSITORY_MANAGER_H