QmlDesiger: add LazyUniquePtr

Creating a memory on heap is not cheap. To defer it LazyUniquePtr is
allocating as the type is cast.

Change-Id: Id3239da7136101040fcb47c9359c96d8ca236bb5
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
This commit is contained in:
Marco Bubke
2025-02-11 14:42:48 +01:00
parent 22335b0e12
commit 5bc716d956
4 changed files with 58 additions and 5 deletions

View File

@@ -6,6 +6,8 @@
#include <designsystem/dsconstants.h> #include <designsystem/dsconstants.h>
#include <designsystem/dsthememanager.h> #include <designsystem/dsthememanager.h>
#include <qmldesignerutils/memory.h>
#include <QQmlEngine> #include <QQmlEngine>
namespace QmlDesigner { namespace QmlDesigner {
@@ -74,8 +76,8 @@ QStringList DesignSystemInterface::collections() const
CollectionModel *DesignSystemInterface::createModel(const QString &typeName, DSThemeManager *collection) CollectionModel *DesignSystemInterface::createModel(const QString &typeName, DSThemeManager *collection)
{ {
auto [newItr, success] = m_models.try_emplace(typeName, auto [newItr, success] = m_models.try_emplace(typeName,
std::make_unique<CollectionModel>(collection, makeLazyUniquePtr<CollectionModel>(collection,
m_store)); m_store));
if (success) { if (success) {
// Otherwise the model will be deleted by the QML engine. // Otherwise the model will be deleted by the QML engine.
QQmlEngine::setObjectOwnership(newItr->second.get(), QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(newItr->second.get(), QQmlEngine::CppOwnership);

View File

@@ -263,9 +263,7 @@ void DSThemeManager::decorateThemeInterface(ModelNode rootNode) const
DSThemeGroup *DSThemeManager::propertyGroup(GroupType type) DSThemeGroup *DSThemeManager::propertyGroup(GroupType type)
{ {
auto itr = m_groups.find(type); auto itr = m_groups.try_emplace(type, makeLazySharedPtr<DSThemeGroup>(type)).first;
if (itr == m_groups.end())
itr = m_groups.try_emplace(type, std::make_unique<DSThemeGroup>(type)).first;
return itr->second.get(); return itr->second.get();
} }

View File

@@ -8,6 +8,7 @@ add_qtc_library(QmlDesignerUtils STATIC
asset.cpp asset.h asset.cpp asset.h
designeralgorithm.h designeralgorithm.h
filedownloader.cpp filedownloader.h filedownloader.cpp filedownloader.h
memory.h
multifiledownloader.cpp multifiledownloader.h multifiledownloader.cpp multifiledownloader.h
fileextractor.cpp fileextractor.h fileextractor.cpp fileextractor.h
hdrimage.cpp hdrimage.h hdrimage.cpp hdrimage.h

View File

@@ -0,0 +1,52 @@
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include <memory>
#include <tuple>
namespace QmlDesigner {
template<typename Pointer, typename... Arguments>
class LazyPtr
{
using ResultType = Pointer::element_type;
public:
LazyPtr(Arguments &&...arguments)
: m_arguments{std::forward_as_tuple(std::forward<Arguments>(arguments)...)}
{}
operator Pointer() const
{
return std::apply(
[](auto &&...arguments) {
return Pointer(new ResultType(std::forward<decltype(arguments)>(arguments)...));
},
m_arguments);
}
private:
std::tuple<Arguments...> m_arguments;
};
template<typename ResultType, typename... Arguments>
using LazyUniquePtr = LazyPtr<std::unique_ptr<ResultType>, Arguments...>;
template<typename Result, typename... Arguments>
LazyUniquePtr<Result, Arguments...> makeLazyUniquePtr(Arguments &&...arguments)
{
return LazyUniquePtr<Result, Arguments...>(std::forward<Arguments>(arguments)...);
}
template<typename ResultType, typename... Arguments>
using LazySharedPtr = LazyPtr<std::shared_ptr<ResultType>, Arguments...>;
template<typename ResultType, typename... Arguments>
LazySharedPtr<ResultType, Arguments...> makeLazySharedPtr(Arguments &&...arguments)
{
return LazySharedPtr<ResultType, Arguments...>(std::forward<Arguments>(arguments)...);
}
} // namespace QmlDesigner