From 2ed9bc1880ea816bdc46558f4daad4bee4f55143 Mon Sep 17 00:00:00 2001 From: mvglasow Date: Sun, 12 Oct 2025 16:39:39 +0300 Subject: [PATCH] [traffic] Properly process message replacement Signed-off-by: mvglasow --- libs/map/traffic_manager.cpp | 7 +++++ libs/traffxml/traff_decoder.cpp | 48 +++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/libs/map/traffic_manager.cpp b/libs/map/traffic_manager.cpp index c74d36488..523f8adaa 100644 --- a/libs/map/traffic_manager.cpp +++ b/libs/map/traffic_manager.cpp @@ -639,6 +639,13 @@ void TrafficManager::DecodeFirstMessage() // store message in cache m_messageCache.insert_or_assign(message.m_id, message); + + for (auto & replaced : message.m_replaces) + { + auto it = m_messageCache.find(replaced); + if (it != m_messageCache.cend()) + m_messageCache.erase(it); + } } /* * TODO detect if we can do a quick update: diff --git a/libs/traffxml/traff_decoder.cpp b/libs/traffxml/traff_decoder.cpp index e09277500..cf3527650 100644 --- a/libs/traffxml/traff_decoder.cpp +++ b/libs/traffxml/traff_decoder.cpp @@ -210,29 +210,43 @@ void TraffDecoder::DecodeMessage(traffxml::TraffMessage & message) return; traffxml::MultiMwmColoring decoded; + bool isDecoded = false; - auto it = m_messageCache.find(message.m_id); - if ((it != m_messageCache.end()) - && !it->second.m_decoded.empty() - && (it->second.m_location == message.m_location)) + std::vector ids = message.m_replaces; + ids.insert(ids.begin(), message.m_id); + + for (auto & id : ids) { - // cache already has a message with reusable location - - LOG(LINFO, (" Location for message", message.m_id, "can be reused from cache")); - - std::optional cachedImpact = it->second.GetTrafficImpact(); - if (cachedImpact.has_value() && cachedImpact.value() == impact.value()) + auto it = m_messageCache.find(id); + if ((it != m_messageCache.end()) + && !it->second.m_decoded.empty() + && (it->second.m_location == message.m_location)) { - LOG(LINFO, (" Impact for message", message.m_id, "unchanged, reusing cached coloring")); + // cache already has a message with reusable location - // same impact, m_decoded can be reused altogether - message.m_decoded = it->second.m_decoded; - return; + LOG(LINFO, (" Location for message", message.m_id, "can be reused from cache")); + + std::optional cachedImpact = it->second.GetTrafficImpact(); + if (cachedImpact.has_value() && cachedImpact.value() == impact.value()) + { + LOG(LINFO, (" Impact for message", message.m_id, "unchanged, reusing cached coloring")); + + // same impact, m_decoded can be reused altogether + message.m_decoded = it->second.m_decoded; + return; + } + else if (!isDecoded) + { + /* + * populate only on first occurrence but continue searching, we might find a matching + * location with matching impact + */ + decoded = it->second.m_decoded; + isDecoded = true; + } } - else - decoded = it->second.m_decoded; } - else + if (!isDecoded) DecodeLocation(message, decoded); if (impact)