#include #include #include #include #include namespace mbgl { template StyleDifference diff(const std::vector& a, const std::vector& b) { std::vector lcs; auto eq = [] (const T& lhs, const T& rhs) { return std::tie(lhs->id, lhs->type) == std::tie(rhs->id, rhs->type); }; longest_common_subsequence(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(lcs), eq); auto aIt = a.begin(); auto bIt = b.begin(); auto lIt = lcs.begin(); StyleDifference result; while (aIt != a.end() || bIt != b.end()) { if (aIt != a.end() && (lIt == lcs.end() || !eq(*lIt, *aIt))) { result.removed.emplace((*aIt)->id, *aIt); aIt++; } else if (bIt != b.end() && (lIt == lcs.end() || !eq(*lIt, *bIt))) { result.added.emplace((*bIt)->id, *bIt); bIt++; } else { if (aIt->get() != bIt->get()) { result.changed.emplace((*bIt)->id, *bIt); } aIt++; bIt++; lIt++; } } return result; } SourceDifference diffSources(const std::vector& a, const std::vector& b) { return diff(a, b); } LayerDifference diffLayers(const std::vector& a, const std::vector& b) { return diff(a, b); } } // namespace mbgl