QFactoryLoader: embed the Private class into the front-end

Simplifies the code and avoids unnecessary indirections.

It's done in a quirky way with a d member with operator->() to mostly
preserve Git history.

Change-Id: I0989ef9b4cd7a620c891fffdb521d4280896d275
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Thiago Macieira 2025-01-10 17:38:01 -03:00
parent 411a8332a7
commit 4c2d3b7a4c
2 changed files with 26 additions and 41 deletions

View File

@ -5,7 +5,6 @@
#include "qfactoryloader_p.h"
#include "private/qcoreapplication_p.h"
#include "private/qduplicatetracker_p.h"
#include "private/qloggingregistry_p.h"
#include "qcborarray.h"
#include "qcbormap.h"
@ -16,20 +15,11 @@
#include "qjsonarray.h"
#include "qjsondocument.h"
#include "qjsonobject.h"
#include "qmutex.h"
#include "qplugin.h"
#include "qplugin_p.h"
#include "qpluginloader.h"
#if QT_CONFIG(library)
# include "qlibrary_p.h"
#endif
#include <qtcore_tracepoints_p.h>
#include <map>
#include <vector>
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
@ -247,28 +237,6 @@ QJsonObject QPluginParsedMetaData::toJson() const
return o;
}
class QFactoryLoaderPrivate
{
Q_DISABLE_COPY_MOVE(QFactoryLoaderPrivate)
public:
QFactoryLoaderPrivate() { }
QByteArray iid;
mutable QMutex mutex;
mutable QList<QtPluginInstanceFunction> usedStaticInstances;
#if QT_CONFIG(library)
~QFactoryLoaderPrivate();
QDuplicateTracker<QString> loadedPaths;
std::vector<QLibraryPrivate::UniquePtr> libraries;
mutable QList<bool> loadedLibraries;
std::map<QString, QLibraryPrivate*> keyMap;
QString suffix;
QString extraSearchPath;
Qt::CaseSensitivity cs;
void updateSinglePath(const QString &pluginDir);
#endif
};
#if QT_CONFIG(library)
Q_STATIC_LOGGING_CATEGORY_WITH_ENV_OVERRIDE(lcFactoryLoader, "QT_DEBUG_PLUGINS",
@ -286,10 +254,7 @@ struct QFactoryLoaderGlobals
Q_GLOBAL_STATIC(QFactoryLoaderGlobals, qt_factoryloader_global)
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
= default;
inline void QFactoryLoaderPrivate::updateSinglePath(const QString &path)
inline void QFactoryLoader::Private::updateSinglePath(const QString &path)
{
struct LibraryReleaser {
void operator()(QLibraryPrivate *library)
@ -462,7 +427,6 @@ void QFactoryLoader::refreshAll()
QFactoryLoader::QFactoryLoader(const char *iid,
const QString &suffix,
Qt::CaseSensitivity cs)
: d(new QFactoryLoaderPrivate)
{
Q_ASSERT_X(suffix.startsWith(u'/'), "QFactoryLoader",
"For historical reasons, the suffix must start with '/' (and it can't be empty)");

View File

@ -20,19 +20,22 @@
#ifndef QT_NO_QOBJECT
#include "QtCore/private/qplugin_p.h"
#include "QtCore/qcbormap.h"
#include "QtCore/qcborvalue.h"
#include "QtCore/private/qduplicatetracker_p.h"
#include "QtCore/qcoreapplication.h"
#include "QtCore/qmap.h"
#include "QtCore/qmutex.h"
#include "QtCore/qobject.h"
#include "QtCore/qplugin.h"
#if QT_CONFIG(library)
# include "QtCore/private/qlibrary_p.h"
#endif
QT_BEGIN_NAMESPACE
class QJsonObject;
class QLibraryPrivate;
class QFactoryLoaderPrivate;
class Q_CORE_EXPORT QFactoryLoader
{
Q_DECLARE_TR_FUNCTIONS(QFactoryLoader);
@ -64,7 +67,25 @@ public:
QObject *instance(int index) const;
private:
std::unique_ptr<QFactoryLoaderPrivate> d;
struct Private {
QByteArray iid;
mutable QMutex mutex;
mutable QList<QtPluginInstanceFunction> usedStaticInstances;
#if QT_CONFIG(library)
QDuplicateTracker<QString> loadedPaths;
std::vector<QLibraryPrivate::UniquePtr> libraries;
mutable QList<bool> loadedLibraries;
std::map<QString, QLibraryPrivate*> keyMap;
QString suffix;
QString extraSearchPath;
Qt::CaseSensitivity cs;
void updateSinglePath(const QString &pluginDir);
#endif
// for compat when we d was a pointer
auto operator->() { return this; }
auto operator->() const { return this; }
} d;
inline QObject *instanceHelper_locked(int index) const;
};