diff --git a/src/libs/solutions/tasking/tasktree.cpp b/src/libs/solutions/tasking/tasktree.cpp index 0d9921adea3..31d90bbfa9e 100644 --- a/src/libs/solutions/tasking/tasktree.cpp +++ b/src/libs/solutions/tasking/tasktree.cpp @@ -1249,6 +1249,7 @@ public: } const std::optional m_loopCount = {}; + const Loop::ValueGetter m_valueGetter = {}; const Loop::Condition m_condition = {}; std::mutex m_threadDataMutex = {}; // Use std::map on purpose, so that it doesn't invalidate references on modifications. @@ -1260,12 +1261,12 @@ Loop::Loop() : m_loopData(new LoopData) {} -Loop::Loop(int count) - : m_loopData(new LoopData{count}) +Loop::Loop(int count, const ValueGetter &valueGetter) + : m_loopData(new LoopData{count, valueGetter}) {} Loop::Loop(const Condition &condition) - : m_loopData(new LoopData{{}, condition}) + : m_loopData(new LoopData{{}, {}, condition}) {} int Loop::iteration() const @@ -1273,6 +1274,11 @@ int Loop::iteration() const return m_loopData->threadData().iteration(); } +const void *Loop::valuePtr() const +{ + return m_loopData->m_valueGetter(iteration()); +} + using StoragePtr = void *; class StorageThreadData diff --git a/src/libs/solutions/tasking/tasktree.h b/src/libs/solutions/tasking/tasktree.h index 775119cfe62..c79af00179c 100644 --- a/src/libs/solutions/tasking/tasktree.h +++ b/src/libs/solutions/tasking/tasktree.h @@ -6,6 +6,7 @@ #include "tasking_global.h" #include +#include #include #include @@ -101,14 +102,17 @@ class TASKING_EXPORT Loop { public: using Condition = std::function; // Takes iteration, called prior to each iteration. + using ValueGetter = std::function; // Takes iteration, returns ptr to ref. int iteration() const; protected: Loop(); // LoopForever - Loop(int count); // LoopRepeat + Loop(int count, const ValueGetter &valueGetter = {}); // LoopRepeat, LoopList Loop(const Condition &condition); // LoopUntil + const void *valuePtr() const; + private: friend class ExecutionContextActivator; friend class TaskTreePrivate; @@ -133,6 +137,15 @@ public: LoopUntil(const Condition &condition) : Loop(condition) {} }; +template +class LoopList final : public Loop +{ +public: + LoopList(const QList &list) : Loop(list.size(), [list](int i) { return &list.at(i); }) {} + const T *operator->() const { return static_cast(valuePtr()); } + const T &operator*() const { return *static_cast(valuePtr()); } +}; + class TASKING_EXPORT StorageBase { private: