forked from qt-creator/qt-creator
TaskTree: Use DoneResult in Group done handler
Instead of using ambiguous bool. Change-Id: Icf63f0b129d4b81cc4324d7a100f5aaf2c8af44b Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -1086,7 +1086,7 @@ public:
|
||||
SetupResult startChildren(int nextChild);
|
||||
SetupResult childDone(bool success);
|
||||
void stop();
|
||||
bool invokeDoneHandler(DoneWith result);
|
||||
bool invokeDoneHandler(DoneWith doneWith);
|
||||
bool isRunning() const { return m_runtimeData.has_value(); }
|
||||
bool isStarting() const { return isRunning() && m_runtimeData->m_startGuard.isLocked(); }
|
||||
|
||||
@@ -1451,15 +1451,15 @@ static bool shouldCall(CallDoneIf callDoneIf, DoneWith result)
|
||||
return callDoneIf != CallDoneIf::Success;
|
||||
}
|
||||
|
||||
bool TaskContainer::invokeDoneHandler(DoneWith result)
|
||||
bool TaskContainer::invokeDoneHandler(DoneWith doneWith)
|
||||
{
|
||||
bool success = result == DoneWith::Success;
|
||||
DoneResult result = toDoneResult(doneWith);
|
||||
const GroupItem::GroupHandler &groupHandler = m_constData.m_groupHandler;
|
||||
if (groupHandler.m_doneHandler && shouldCall(groupHandler.m_callDoneIf, result))
|
||||
success = invokeHandler(this, groupHandler.m_doneHandler, result);
|
||||
if (groupHandler.m_doneHandler && shouldCall(groupHandler.m_callDoneIf, doneWith))
|
||||
result = invokeHandler(this, groupHandler.m_doneHandler, doneWith);
|
||||
m_runtimeData->m_callStorageDoneHandlersOnDestruction = true;
|
||||
m_runtimeData.reset();
|
||||
return success;
|
||||
return result == DoneResult::Success;
|
||||
}
|
||||
|
||||
SetupResult TaskNode::start()
|
||||
|
@@ -194,7 +194,7 @@ public:
|
||||
// Called when group entered, after group's storages are created
|
||||
using GroupSetupHandler = std::function<SetupResult()>;
|
||||
// Called when group done, before group's storages are deleted
|
||||
using GroupDoneHandler = std::function<bool(DoneWith)>;
|
||||
using GroupDoneHandler = std::function<DoneResult(DoneWith)>;
|
||||
|
||||
struct TaskHandler {
|
||||
TaskCreateHandler m_createHandler;
|
||||
@@ -315,24 +315,24 @@ private:
|
||||
template <typename Handler>
|
||||
static GroupDoneHandler wrapGroupDone(Handler &&handler)
|
||||
{
|
||||
// B, V, D stands for: [B]ool, [V]oid, [D]oneWith
|
||||
static constexpr bool isBD = isInvocable<bool, Handler, DoneWith>();
|
||||
static constexpr bool isB = isInvocable<bool, Handler>();
|
||||
static constexpr bool isVD = isInvocable<void, Handler, DoneWith>();
|
||||
// D, V, W stands for: [D]oneResult, [V]oid, Done[W]ith
|
||||
static constexpr bool isDW = isInvocable<DoneResult, Handler, DoneWith>();
|
||||
static constexpr bool isD = isInvocable<DoneResult, Handler>();
|
||||
static constexpr bool isVW = isInvocable<void, Handler, DoneWith>();
|
||||
static constexpr bool isV = isInvocable<void, Handler>();
|
||||
static_assert(isBD || isB || isVD || isV,
|
||||
static_assert(isDW || isD || isVW || isV,
|
||||
"Group done handler needs to take (DoneWith) or (void) as an argument and has to "
|
||||
"return void or bool. The passed handler doesn't fulfill these requirements.");
|
||||
"return void or DoneResult. The passed handler doesn't fulfill these requirements.");
|
||||
return [=](DoneWith result) {
|
||||
if constexpr (isBD)
|
||||
if constexpr (isDW)
|
||||
return std::invoke(handler, result);
|
||||
if constexpr (isB)
|
||||
if constexpr (isD)
|
||||
return std::invoke(handler);
|
||||
if constexpr (isVD)
|
||||
if constexpr (isVW)
|
||||
std::invoke(handler, result);
|
||||
else if constexpr (isV)
|
||||
std::invoke(handler);
|
||||
return result == DoneWith::Success;
|
||||
return result == DoneWith::Success ? DoneResult::Success : DoneResult::Error;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@@ -392,11 +392,6 @@ static Handler toTweakSetupHandler(SetupResult result)
|
||||
return Handler::TweakSetupToContinue;
|
||||
}
|
||||
|
||||
static Handler toTweakDoneHandler(bool success)
|
||||
{
|
||||
return success ? Handler::TweakDoneToSuccess : Handler::TweakDoneToError;
|
||||
}
|
||||
|
||||
static Handler toTweakDoneHandler(DoneResult result)
|
||||
{
|
||||
return result == DoneResult::Success ? Handler::TweakDoneToSuccess : Handler::TweakDoneToError;
|
||||
@@ -551,11 +546,11 @@ void tst_Tasking::testTree_data()
|
||||
return desiredResult;
|
||||
});
|
||||
};
|
||||
const auto groupDoneWithTweak = [storage](int taskId, bool desiredResult) {
|
||||
return onGroupDone([storage, taskId, desiredResult](DoneWith result) {
|
||||
storage->m_log.append({taskId, resultToGroupHandler(result)});
|
||||
storage->m_log.append({taskId, toTweakDoneHandler(desiredResult)});
|
||||
return desiredResult;
|
||||
const auto groupDoneWithTweak = [storage](int taskId, DoneResult result) {
|
||||
return onGroupDone([storage, taskId, result](DoneWith doneWith) {
|
||||
storage->m_log.append({taskId, resultToGroupHandler(doneWith)});
|
||||
storage->m_log.append({taskId, toTweakDoneHandler(result)});
|
||||
return result;
|
||||
});
|
||||
};
|
||||
const auto createSync = [storage](int taskId) {
|
||||
@@ -1611,18 +1606,18 @@ void tst_Tasking::testTree_data()
|
||||
{
|
||||
// This test checks whether group done handler's result is properly dispatched.
|
||||
const auto createRoot = [storage, createTask, groupDone, groupDoneWithTweak](
|
||||
DoneResult firstResult, bool desiredResult) {
|
||||
DoneResult firstResult, DoneResult secondResult) {
|
||||
return Group {
|
||||
Storage(storage),
|
||||
Group {
|
||||
createTask(1, firstResult),
|
||||
groupDoneWithTweak(1, desiredResult)
|
||||
groupDoneWithTweak(1, secondResult)
|
||||
},
|
||||
groupDone(0)
|
||||
};
|
||||
};
|
||||
|
||||
const Group root1 = createRoot(DoneResult::Success, true);
|
||||
const Group root1 = createRoot(DoneResult::Success, DoneResult::Success);
|
||||
const Log log1 {
|
||||
{1, Handler::Setup},
|
||||
{1, Handler::Success},
|
||||
@@ -1633,7 +1628,7 @@ void tst_Tasking::testTree_data()
|
||||
QTest::newRow("GroupDoneWithSuccessTweakToSuccess")
|
||||
<< TestData{storage, root1, log1, 1, OnDone::Success};
|
||||
|
||||
const Group root2 = createRoot(DoneResult::Success, false);
|
||||
const Group root2 = createRoot(DoneResult::Success, DoneResult::Error);
|
||||
const Log log2 {
|
||||
{1, Handler::Setup},
|
||||
{1, Handler::Success},
|
||||
@@ -1644,7 +1639,7 @@ void tst_Tasking::testTree_data()
|
||||
QTest::newRow("GroupDoneWithSuccessTweakToError")
|
||||
<< TestData{storage, root2, log2, 1, OnDone::Failure};
|
||||
|
||||
const Group root3 = createRoot(DoneResult::Error, true);
|
||||
const Group root3 = createRoot(DoneResult::Error, DoneResult::Success);
|
||||
const Log log3 {
|
||||
{1, Handler::Setup},
|
||||
{1, Handler::Error},
|
||||
@@ -1655,7 +1650,7 @@ void tst_Tasking::testTree_data()
|
||||
QTest::newRow("GroupDoneWithErrorTweakToSuccess")
|
||||
<< TestData{storage, root3, log3, 1, OnDone::Success};
|
||||
|
||||
const Group root4 = createRoot(DoneResult::Error, false);
|
||||
const Group root4 = createRoot(DoneResult::Error, DoneResult::Error);
|
||||
const Log log4 {
|
||||
{1, Handler::Setup},
|
||||
{1, Handler::Error},
|
||||
|
Reference in New Issue
Block a user