From 55c511206be2b6f61af1735322f9421c8e225de8 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@bred.dog>
Date: Mon, 22 Jul 2019 03:29:14 -0400
Subject: [PATCH] Replace a few boost::unordered with absl::flat_hash

---
 indra/newview/alavatarcolormgr.cpp   |  4 ++--
 indra/newview/alavatarcolormgr.h     |  4 ++--
 indra/newview/llmaterialmgr.h        | 17 ++++++++---------
 indra/newview/llviewerobjectlist.cpp | 22 +++++++++++++++++++---
 indra/newview/llviewerobjectlist.h   |  7 ++++---
 5 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/indra/newview/alavatarcolormgr.cpp b/indra/newview/alavatarcolormgr.cpp
index 0e85e13679..ba6be8984c 100644
--- a/indra/newview/alavatarcolormgr.cpp
+++ b/indra/newview/alavatarcolormgr.cpp
@@ -52,7 +52,7 @@ void ALAvatarColorMgr::addOrUpdateCustomColor(const LLUUID& id, EAvatarColors co
 
 void ALAvatarColorMgr::clearCustomColor(const LLUUID& id)
 {
-	const uuid_color_umap_t::const_iterator it = mCustomColors.find(id);
+	auto it = mCustomColors.find(id);
 	if (it != mCustomColors.cend())
 	{
 		mCustomColors.erase(it);
@@ -61,7 +61,7 @@ void ALAvatarColorMgr::clearCustomColor(const LLUUID& id)
 
 const LLColor4& ALAvatarColorMgr::getColor(const LLUUID& id)
 {
-	uuid_color_umap_t::const_iterator user_col_it = mCustomColors.find(id);
+	auto user_col_it = mCustomColors.find(id);
 	if (user_col_it != mCustomColors.cend())
 	{
 		const EAvatarColors color_val = user_col_it->second;
diff --git a/indra/newview/alavatarcolormgr.h b/indra/newview/alavatarcolormgr.h
index 4abc392050..ae9ffd4d79 100644
--- a/indra/newview/alavatarcolormgr.h
+++ b/indra/newview/alavatarcolormgr.h
@@ -21,7 +21,7 @@
 
 #include "llsingleton.h"
 
-#include <boost/unordered_map.hpp>
+#include <absl/container/flat_hash_map.h>
 
 class LLColor4;
 class LLUUID;
@@ -45,6 +45,6 @@ public:
 	const LLColor4& getColor(const LLUUID& id);
 
 private:
-	typedef boost::unordered_map<LLUUID, EAvatarColors> uuid_color_umap_t;
+	typedef absl::flat_hash_map<LLUUID, EAvatarColors> uuid_color_umap_t;
 	uuid_color_umap_t mCustomColors;
 };
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index a9f0cf3dd5..669695dd1e 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -33,6 +33,7 @@
 #include "httprequest.h"
 #include "httpheaders.h"
 #include "httpoptions.h"
+#include "absl/hash/hash.h"
 
 class LLViewerRegion;
 
@@ -91,17 +92,15 @@ private:
 		U32 te;
 		LLMaterialID materialID;
 
+		template <typename H>
+		friend H AbslHashValue(H h, const TEMaterialPair& m) {
+			return H::combine(std::move(h), m.materialID, m.te);
+		}
+
 		bool operator==(const TEMaterialPair& b) const { return (materialID == b.materialID) && (te == b.te); }
+		bool operator<(const TEMaterialPair& b) const { return (te < b.te) ? TRUE : (materialID < b.materialID);}
 	};
 	
-	friend inline bool operator<(
-		const LLMaterialMgr::TEMaterialPair& lhs,
-		const LLMaterialMgr::TEMaterialPair& rhs)
-	{
-		return (lhs.te	< rhs.te) ? TRUE :
-			(lhs.materialID < rhs.materialID);
-	}
-
 	struct TEMaterialPairHasher
 	{
 		enum { bucket_size = 8 };
@@ -116,7 +115,7 @@ private:
 	typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t;
 
 
-	typedef boost::unordered_map<TEMaterialPair, get_callback_te_t*, TEMaterialPairHasher> get_callback_te_map_t;
+	typedef boost::unordered_map<TEMaterialPair, get_callback_te_t*, absl::Hash<TEMaterialPair> > get_callback_te_map_t;
 	typedef std::set<LLUUID> getall_queue_t;
 	typedef std::map<LLUUID, F64> getall_pending_map_t;
 	typedef std::map<LLUUID, getall_callback_t*> getall_callback_map_t;
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index d345aa3902..5a778bbaed 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -2021,7 +2021,12 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi
 		return nullptr;
 	}
 
-	mUUIDObjectMap[fullid] = objectp;
+	const auto& iter_pair = mUUIDObjectMap.try_emplace(fullid, objectp);
+	if (!iter_pair.second && iter_pair.first != mUUIDObjectMap.end())
+	{
+		iter_pair.first->second = objectp;
+		//LL_WARNS("ObjectUpdate") << "Object already exists in object map " << iter_pair.first->first << LL_ENDL;
+	}
 
 	mObjects.push_back(objectp);
 
@@ -2045,7 +2050,13 @@ LLViewerObject *LLViewerObjectList::createObjectFromCache(const LLPCode pcode, L
 	}
 
 	objectp->mLocalID = local_id;
-	mUUIDObjectMap[uuid] = objectp;
+	const auto& iter_pair = mUUIDObjectMap.try_emplace(uuid, objectp);
+	if (!iter_pair.second && iter_pair.first != mUUIDObjectMap.end())
+	{
+		iter_pair.first->second = objectp;
+		//LL_WARNS("ObjectUpdate") << "Object already exists in object map " << iter_pair.first->first << LL_ENDL;
+	}
+
 	setUUIDAndLocal(uuid,
 					local_id,
 					regionp->getHost().getAddress(),
@@ -2085,7 +2096,12 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe
 		regionp->addToCreatedList(local_id); 
 	}
 
-	mUUIDObjectMap[fullid] = objectp;
+	const auto& iter_pair = mUUIDObjectMap.try_emplace(fullid, objectp);
+	if (!iter_pair.second && iter_pair.first != mUUIDObjectMap.end())
+	{
+		iter_pair.first->second = objectp;
+		//LL_WARNS("ObjectUpdate") << "Object already exists in object map " << iter_pair.first->first << LL_ENDL;
+	}
 	setUUIDAndLocal(fullid,
 					local_id,
 					gMessageSystem->getSenderIP(),
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 22b7da78be..646f441b91 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -28,6 +28,7 @@
 #define LL_LLVIEWEROBJECTLIST_H
 
 #include <boost/unordered_map.hpp>
+#include <absl/container/flat_hash_map.h>
 
 // common includes
 #include "lltrace.h"
@@ -205,7 +206,7 @@ protected:
 
     uuid_set_t   mDeadObjects;
 
-	boost::unordered_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
+	absl::flat_hash_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
 
 	//set of objects that need to update their cost
     uuid_set_t   mStaleObjectCost;
@@ -263,8 +264,8 @@ extern LLViewerObjectList gObjectList;
  */
 inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
 {
-	boost::unordered_map<LLUUID, LLPointer<LLViewerObject> >::const_iterator iter = mUUIDObjectMap.find(id);
-	if(iter != mUUIDObjectMap.end())
+	auto iter = mUUIDObjectMap.find(id);
+	if(iter != mUUIDObjectMap.cend())
 	{
 		return iter->second;
 	}
-- 
GitLab