From bf587f8540dddb5e0b4661deaf193c575f0493f1 2017-11-28 13:37:12 From: Alexandre Leroux Date: 2017-11-28 13:37:12 Subject: [PATCH] Implements merge method (1) --- diff --git a/core/src/DataSource/DataSourceItemMergeHelper.cpp b/core/src/DataSource/DataSourceItemMergeHelper.cpp index 36a8192..91e60af 100644 --- a/core/src/DataSource/DataSourceItemMergeHelper.cpp +++ b/core/src/DataSource/DataSourceItemMergeHelper.cpp @@ -2,7 +2,54 @@ #include +namespace { + +/** + * Finds in a tree an item similar to the item passed in parameter + * @param item the item for which to find a similar item + * @param root the root item of the tree + * @return the similar item if found, nullptr otherwise + */ +DataSourceItem *findSimilarItem(const DataSourceItem &item, const DataSourceItem &root) +{ + // An item is considered similar to the another item if: + // - the items are both nodes AND + // - the names of the items are identical + + if (item.type() != DataSourceItemType::NODE) { + return nullptr; + } + + DataSourceItem *result{nullptr}; + bool found{false}; + for (auto i = 0, count = root.childCount(); i < count && !found; ++i) { + auto child = root.child(i); + + found = child->type() == DataSourceItemType::NODE + && QString::compare(child->name(), item.name(), Qt::CaseInsensitive) == 0; + if (found) { + result = child; + } + } + + return result; +} + +} // namespace + void DataSourceItemMergeHelper::merge(const DataSourceItem &source, DataSourceItem &dest) { - /// @todo ALX + // Checks if the source item can be merged into the destination item (i.e. there is a child item + // similar to the source item) + if (auto subItem = findSimilarItem(source, dest)) { + // If there is an item similar to the source item, applies the merge recursively + for (auto i = 0, count = source.childCount(); i < count; ++i) { + merge(*source.child(i), *subItem); + } + } + else { + // If no item is similar to the source item, the item is copied as the child of the + // destination item + dest.appendChild(source.clone()); + } }