From 315167a91a42a520d0a6d3e9fe63f913583329ef Mon Sep 17 00:00:00 2001 From: Anthony Nicholls Date: Sat, 1 Jun 2024 01:24:16 +0100 Subject: [PATCH] ValueTree: Optimise when listeners don't remove themselves --- .../values/juce_ValueTree.cpp | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/juce_data_structures/values/juce_ValueTree.cpp b/modules/juce_data_structures/values/juce_ValueTree.cpp index 8c73de1367..e534747f14 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -76,23 +76,21 @@ public: template void callListeners (ValueTree::Listener* listenerToExclude, Function fn) const { - auto numListeners = valueTreesWithListeners.size(); + if (valueTreesWithListeners.size() == 0) + return; - if (numListeners == 1) + if (valueTreesWithListeners.size() == 1) { valueTreesWithListeners.getUnchecked (0)->listeners.callExcluding (listenerToExclude, fn); + return; } - else if (numListeners > 0) + + const auto listenersCopy = valueTreesWithListeners; + + for (auto [i, v] : enumerate (listenersCopy, int{})) { - auto listenersCopy = valueTreesWithListeners; - - for (int i = 0; i < numListeners; ++i) - { - auto* v = listenersCopy.getUnchecked (i); - - if (i == 0 || valueTreesWithListeners.contains (v)) - v->listeners.callExcluding (listenerToExclude, fn); - } + if (valueTreesWithListeners[i] == v || valueTreesWithListeners.contains (v)) + v->listeners.callExcluding (listenerToExclude, fn); } }