diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-04-01 15:22:28 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-04-01 15:24:22 +0300 |
commit | 9aa02769f69ecf5f1204494efd1686af7160baef (patch) | |
tree | 9ed57808b60a8fcd35aede63a957009bb4a9eed4 /src/runtime/dragon/jobs/dragonjobs_common_p.h | |
parent | 22203c3521bc0213226c0c01d8782f0d0656da1e (diff) | |
parent | 5e0bfe934b9930b7e41d457b4f88fce91342a0ea (diff) |
Merge branch '2.3'
Change-Id: I45789a62b7e94717257a1a9ef7030124fbee69c3
Diffstat (limited to 'src/runtime/dragon/jobs/dragonjobs_common_p.h')
-rw-r--r-- | src/runtime/dragon/jobs/dragonjobs_common_p.h | 124 |
1 files changed, 74 insertions, 50 deletions
diff --git a/src/runtime/dragon/jobs/dragonjobs_common_p.h b/src/runtime/dragon/jobs/dragonjobs_common_p.h index bc6e9f0..c32f21e 100644 --- a/src/runtime/dragon/jobs/dragonjobs_common_p.h +++ b/src/runtime/dragon/jobs/dragonjobs_common_p.h @@ -55,11 +55,14 @@ namespace Dragon { template<typename Target, typename Reference> Target synchronizeKeys(Target target, const Reference &reference) { - for (const auto &key : reference.created()) { - target[key]; - } - for (const auto &key : reference.removed()) { - target.remove(key); + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &key = change.id; + if (change.action == Change::Action::Created) { + target[key]; + } else if (change.action == Change::Action::Removed) { + target.remove(key); + } } return target; } @@ -67,14 +70,17 @@ Target synchronizeKeys(Target target, const Reference &reference) template<typename Target, typename Reference, typename Callback> Target synchronizeKeys(Target target, const Reference &reference, Callback callback) { - for (const auto &key : reference.dirtyOrNew()) { - if (target.contains(key)) - target.markDirty(key); - const auto &item = reference[key]; - target.insert(key, callback(key, item)); - } - for (const auto &key : reference.removed()) { - target.remove(key); + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &key = change.id; + if (change.action == Change::Action::Created || change.action == Change::Action::Modified) { + if (target.contains(key)) + target.markDirty(key); + const auto &item = reference[key]; + target.insert(key, callback(key, item)); + } else if (change.action == Change::Action::Removed) { + target.remove(key); + } } return target; } @@ -82,13 +88,15 @@ Target synchronizeKeys(Target target, const Reference &reference, Callback callb template<typename Target, typename Reference, typename Callback> Target synchronizeNew(Target target, const Reference &reference, Callback callback) { - for (const auto &key : reference.created()) { -// Q_ASSERT(!target.contains(key)); - const auto &item = reference[key]; - target.insert(key, callback(key, item)); - } - for (const auto &key : reference.removed()) { - target.remove(key); + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &key = change.id; + if (change.action == Change::Action::Created) { + const auto &item = reference[key]; + target.insert(key, callback(key, item)); + } else if (change.action == Change::Action::Removed) { + target.remove(key); + } } return target; } @@ -96,13 +104,16 @@ Target synchronizeNew(Target target, const Reference &reference, Callback callba template<typename Target, typename Reference, typename Callback> Target synchronizeDirty(Target target, const Reference &reference, Callback callback) { - for (const auto &key : reference.dirty()) { - Q_ASSERT(target.contains(key)); - const auto &sourceItem = reference[key]; - target[key] = callback(key, std::move(target[key]), sourceItem); - } - for (const auto &key : reference.removed()) { - target.remove(key); + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &key = change.id; + if (change.action == Change::Action::Modified) { + Q_ASSERT(target.contains(key)); + const auto &sourceItem = reference[key]; + target[key] = callback(key, std::move(target[key]), sourceItem); + } else if (change.action == Change::Action::Removed) { + target.remove(key); + } } return target; } @@ -119,25 +130,27 @@ Target synchronizeKeys(Target target, Compare compare, CreateFunction create) { - for (const auto &id : reference.dirtyOrNew()) { - if (target.contains(id)) - target.markDirty(id); - - const auto &item = reference[id]; - bool foundExisting = false; - for (const auto &cached : target) { - if (compare(*cached, item)) { - target[id] = cached; - foundExisting = true; - break; + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &id = change.id; + if (change.action == Change::Action::Modified || change.action == Change::Action::Created) { + if (target.contains(id)) + target.markDirty(id); + + const auto &item = reference[id]; + bool foundExisting = false; + for (const auto &cached : target) { + if (compare(*cached, item)) { + target[id] = cached; + foundExisting = true; + break; + } } + if (!foundExisting) + target[id] = create(id, *item); + } else if (change.action == Change::Action::Removed) { + target.remove(id); } - if (!foundExisting) - target[id] = create(id, *item); - } - // Remove unused - for (const auto &key : reference.removed()) { - target.remove(key); } return target; } @@ -148,8 +161,12 @@ Target synchronizeNew(Target target, Compare compare, CreateFunction create) { - for (const auto &id : reference.created()) { -// Q_ASSERT(!target.contains(id)); // this is a bit strict + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &id = change.id; + if (change.action != Change::Action::Created) + continue; + const auto &item = reference[id]; bool foundExisting = false; for (const auto &cached : target) { @@ -171,7 +188,12 @@ Target synchronizeDirty(Target target, Compare compare, CreateFunction create) { - for (const auto &id : reference.dirty()) { + const auto &changes = reference.changes(); + for (const auto &change : changes) { + const auto &id = change.id; + if (change.action != Change::Action::Modified) + continue; + Q_ASSERT(target.contains(id)); // this is a bit strict target.markDirty(id); const auto &item = reference[id]; @@ -192,15 +214,17 @@ Target synchronizeDirty(Target target, template<typename Target, typename Reference, typename Callback> Target rebuildAll(Target target, const Reference &reference, Callback callback) { + for (const auto &change : reference.changes()) { + const auto &key = change.id; + if (change.action == Change::Action::Removed) + target.remove(key); + } for (const auto &key : reference.keys()) { // if (target.contains(key)) const auto &item = reference[key]; target[key] = callback(key, item); target.markDirty(key); } - for (const auto &key : reference.removed()) { - target.remove(key); - } return target; } |