From 537cb9117125f621f34b4d44e3f16a9c8c30313c Mon Sep 17 00:00:00 2001
From: Alexander Gavriliuk <alexandrgproductengine@lindenlab.com>
Date: Thu, 19 Oct 2023 20:44:58 +0200
Subject: [PATCH] SL-20163 Rework add/remove observers in
 LLAvatarPropertiesProcessor

---
 indra/newview/llavatarpropertiesprocessor.cpp | 48 +++++++++----------
 1 file changed, 23 insertions(+), 25 deletions(-)

diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 11609affcf2..cc5fa949afa 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -52,24 +52,23 @@ LLAvatarPropertiesProcessor::~LLAvatarPropertiesProcessor()
 
 void LLAvatarPropertiesProcessor::addObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer)
 {
+	if (!observer)
+		return;
+
 	// Check if that observer is already in mObservers for that avatar_id
-	observer_multimap_t::iterator it;
+	using pair = std::pair<LLUUID, LLAvatarPropertiesObserver*>;
+	observer_multimap_t::iterator begin = mObservers.begin();
+	observer_multimap_t::iterator end = mObservers.end();
+	observer_multimap_t::iterator it = std::find_if(begin, end, [&](const pair& p)
+		{
+			return p.first == avatar_id && p.second == observer;
+		});
 
 	// IAN BUG this should update the observer's UUID if this is a dupe - sent to PE
-	it = mObservers.find(avatar_id);
-	while (it != mObservers.end())
+	if (it == end)
 	{
-		if (it->second == observer)
-		{
-			return;
-		}
-		else
-		{
-			++it;
-		}
+		mObservers.insert(pair(avatar_id, observer));
 	}
-
-	mObservers.insert(std::pair<LLUUID, LLAvatarPropertiesObserver*>(avatar_id, observer));
 }
 
 void LLAvatarPropertiesProcessor::removeObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer)
@@ -79,19 +78,18 @@ void LLAvatarPropertiesProcessor::removeObserver(const LLUUID& avatar_id, LLAvat
 		return;
 	}
 
-	observer_multimap_t::iterator it;
-	it = mObservers.find(avatar_id);
-	while (it != mObservers.end())
-	{
-		if (it->second == observer)
-		{
-			mObservers.erase(it);
-			break;
-		}
-		else
+	// Check if that observer is in mObservers for that avatar_id
+	using pair = std::pair<LLUUID, LLAvatarPropertiesObserver*>;
+	observer_multimap_t::iterator begin = mObservers.begin();
+	observer_multimap_t::iterator end = mObservers.end();
+	observer_multimap_t::iterator it = std::find_if(begin, end, [&](const pair& p)
 		{
-			++it;
-		}
+			return p.first == avatar_id && p.second == observer;
+		});
+
+	if (it != end)
+	{
+		mObservers.erase(it);
 	}
 }
 
-- 
GitLab