aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/tasktree.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2022-11-21 12:20:21 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2022-11-23 12:58:57 +0000
commit1667b062362f844d2542a4af2d47c40c63584e78 (patch)
treef4f7578da6aec3515e8ee699a9323fba0692978b /src/libs/utils/tasktree.cpp
parent129bd24131f2a240a60ce67ee0f31387d8df2da5 (diff)
TaskTree: Introduce TreeStorage class
TreeStorage enables delayed creation of instances of StorageStruct. It encapsutates recipe on how create / delete instance of StorageStruct. It doesn't create any instance of StorageStruct when TreeStorage is created. These instances will be created later, by TaskTree. It will enable getting StorageStruct instance inside task / group handlers (passed by lambda argument). Change-Id: Id707353f196aa5ba3e7876d6c601e04ca08d6e63 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Diffstat (limited to 'src/libs/utils/tasktree.cpp')
-rw-r--r--src/libs/utils/tasktree.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/libs/utils/tasktree.cpp b/src/libs/utils/tasktree.cpp
index fcf47d5065..c99729a5d8 100644
--- a/src/libs/utils/tasktree.cpp
+++ b/src/libs/utils/tasktree.cpp
@@ -9,6 +9,57 @@
namespace Utils {
namespace Tasking {
+bool TreeStorageBase::isValid() const
+{
+ return m_storageData && m_storageData->m_constructor && m_storageData->m_destructor;
+}
+
+TreeStorageBase::TreeStorageBase(StorageConstructor ctor, StorageDestructor dtor)
+ : m_storageData(new StorageData{ctor, dtor}) { }
+
+void *TreeStorageBase::activeStorageVoid() const
+{
+ QTC_ASSERT(m_storageData->m_activeStorage, return nullptr);
+ const auto it = m_storageData->m_storageHash.constFind(m_storageData->m_activeStorage);
+ QTC_ASSERT(it != m_storageData->m_storageHash.constEnd(), return nullptr);
+ return it.value();
+}
+
+int TreeStorageBase::createStorage()
+{
+ QTC_ASSERT(m_storageData->m_constructor, return 0); // TODO: add isValid()?
+ QTC_ASSERT(m_storageData->m_destructor, return 0);
+ QTC_ASSERT(m_storageData->m_activeStorage == 0, return 0); // TODO: should be allowed?
+ const int newId = ++m_storageData->m_storageCounter;
+ m_storageData->m_storageHash.insert(newId, m_storageData->m_constructor());
+ return newId;
+}
+
+void TreeStorageBase::deleteStorage(int id)
+{
+ QTC_ASSERT(m_storageData->m_constructor, return); // TODO: add isValid()?
+ QTC_ASSERT(m_storageData->m_destructor, return);
+ QTC_ASSERT(m_storageData->m_activeStorage == 0, return); // TODO: should be allowed?
+ const auto it = m_storageData->m_storageHash.find(id);
+ QTC_ASSERT(it != m_storageData->m_storageHash.end(), return);
+ m_storageData->m_destructor(it.value());
+ m_storageData->m_storageHash.erase(it);
+}
+
+// passing 0 deactivates currently active storage
+void TreeStorageBase::activateStorage(int id)
+{
+ if (id == 0) {
+ QTC_ASSERT(m_storageData->m_activeStorage, return);
+ m_storageData->m_activeStorage = 0;
+ return;
+ }
+ QTC_ASSERT(m_storageData->m_activeStorage == 0, return);
+ const auto it = m_storageData->m_storageHash.find(id);
+ QTC_ASSERT(it != m_storageData->m_storageHash.end(), return);
+ m_storageData->m_activeStorage = id;
+}
+
Execute sequential(ExecuteMode::Sequential);
Execute parallel(ExecuteMode::Parallel);
Workflow stopOnError(WorkflowPolicy::StopOnError);