summaryrefslogtreecommitdiffstats
path: root/src/runtime/dragon/jobs/dragonjobs_common_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/dragon/jobs/dragonjobs_common_p.h')
-rw-r--r--src/runtime/dragon/jobs/dragonjobs_common_p.h124
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;
}