From 667975fe3adee935a3f4d2b1a421a295771c664d Mon Sep 17 00:00:00 2001
From: Loic Blot <loic.blot@unix-experience.fr>
Date: Thu, 6 Oct 2016 08:48:20 +0200
Subject: [PATCH] Use more unordered_maps to improve performance in c++11
 builds

---
 src/client.cpp                      |  9 +++------
 src/client.h                        |  6 +++---
 src/clientobject.cpp                | 10 ++++------
 src/clientobject.h                  |  3 ++-
 src/content_cao.cpp                 |  2 +-
 src/network/clientpackethandler.cpp |  4 +---
 src/script/lua_api/l_mapgen.cpp     |  4 ++--
 src/server.cpp                      |  8 ++++----
 src/util/string.h                   |  3 ++-
 9 files changed, 22 insertions(+), 27 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index a599e21dc..63653998a 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -623,10 +623,8 @@ void Client::step(float dtime)
 		Update positions of sounds attached to objects
 	*/
 	{
-		for(std::map<int, u16>::iterator
-				i = m_sounds_to_objects.begin();
-				i != m_sounds_to_objects.end(); ++i)
-		{
+		for(UNORDERED_MAP<int, u16>::iterator i = m_sounds_to_objects.begin();
+				i != m_sounds_to_objects.end(); ++i) {
 			int client_id = i->first;
 			u16 object_id = i->second;
 			ClientActiveObject *cao = m_env.getActiveObject(object_id);
@@ -645,8 +643,7 @@ void Client::step(float dtime)
 		m_removed_sounds_check_timer = 0;
 		// Find removed sounds and clear references to them
 		std::vector<s32> removed_server_ids;
-		for(std::map<s32, int>::iterator
-				i = m_sounds_server_to_client.begin();
+		for(UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.begin();
 				i != m_sounds_server_to_client.end();) {
 			s32 server_id = i->first;
 			int client_id = i->second;
diff --git a/src/client.h b/src/client.h
index fb479068f..a71c1dcbc 100644
--- a/src/client.h
+++ b/src/client.h
@@ -663,11 +663,11 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 	// Sounds
 	float m_removed_sounds_check_timer;
 	// Mapping from server sound ids to our sound ids
-	std::map<s32, int> m_sounds_server_to_client;
+	UNORDERED_MAP<s32, int> m_sounds_server_to_client;
 	// And the other way!
-	std::map<int, s32> m_sounds_client_to_server;
+	UNORDERED_MAP<int, s32> m_sounds_client_to_server;
 	// And relations to objects
-	std::map<int, u16> m_sounds_to_objects;
+	UNORDERED_MAP<int, u16> m_sounds_to_objects;
 
 	// Privileges
 	UNORDERED_SET<std::string> m_privileges;
diff --git a/src/clientobject.cpp b/src/clientobject.cpp
index a11757ea6..ff3f47187 100644
--- a/src/clientobject.cpp
+++ b/src/clientobject.cpp
@@ -43,12 +43,11 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
 		IGameDef *gamedef, ClientEnvironment *env)
 {
 	// Find factory function
-	std::map<u16, Factory>::iterator n;
-	n = m_types.find(type);
+	UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
 	if(n == m_types.end()) {
 		// If factory is not found, just return.
-		warningstream<<"ClientActiveObject: No factory for type="
-				<<(int)type<<std::endl;
+		warningstream << "ClientActiveObject: No factory for type="
+				<< (int)type << std::endl;
 		return NULL;
 	}
 
@@ -59,8 +58,7 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
 
 void ClientActiveObject::registerType(u16 type, Factory f)
 {
-	std::map<u16, Factory>::iterator n;
-	n = m_types.find(type);
+	UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
 	if(n != m_types.end())
 		return;
 	m_types[type] = f;
diff --git a/src/clientobject.h b/src/clientobject.h
index 3cc7c2391..c4e1a634b 100644
--- a/src/clientobject.h
+++ b/src/clientobject.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irrlichttypes_extrabloated.h"
 #include "activeobject.h"
 #include <map>
+#include "util/cpp11_container.h"
 
 /*
 
@@ -103,7 +104,7 @@ class ClientActiveObject : public ActiveObject
 	ClientEnvironment *m_env;
 private:
 	// Used for creating objects based on type
-	static std::map<u16, Factory> m_types;
+	static UNORDERED_MAP<u16, Factory> m_types;
 };
 
 struct DistanceSortedActiveObject
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index a141690f6..33dae6822 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -51,7 +51,7 @@ struct ToolCapabilities;
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
-std::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
+UNORDERED_MAP<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
 
 SmoothTranslator::SmoothTranslator():
 	vect_old(0,0,0),
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 48c573da5..6d42edd7d 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -812,9 +812,7 @@ void Client::handleCommand_StopSound(NetworkPacket* pkt)
 
 	*pkt >> server_id;
 
-	std::map<s32, int>::iterator i =
-		m_sounds_server_to_client.find(server_id);
-
+	UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.find(server_id);
 	if (i != m_sounds_server_to_client.end()) {
 		int client_id = i->second;
 		m_sound->stopSound(client_id);
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index a176f4f52..da8e71cdc 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -244,7 +244,7 @@ bool read_schematic_def(lua_State *L, int index,
 	schem->schemdata = new MapNode[numnodes];
 
 	size_t names_base = names->size();
-	std::map<std::string, content_t> name_id_map;
+	UNORDERED_MAP<std::string, content_t> name_id_map;
 
 	u32 i = 0;
 	for (lua_pushnil(L); lua_next(L, -2); i++, lua_pop(L, 1)) {
@@ -266,7 +266,7 @@ bool read_schematic_def(lua_State *L, int index,
 		u8 param2 = getintfield_default(L, -1, "param2", 0);
 
 		//// Find or add new nodename-to-ID mapping
-		std::map<std::string, content_t>::iterator it = name_id_map.find(name);
+		UNORDERED_MAP<std::string, content_t>::iterator it = name_id_map.find(name);
 		content_t name_index;
 		if (it != name_id_map.end()) {
 			name_index = it->second;
diff --git a/src/server.cpp b/src/server.cpp
index a8494f76e..e9983ba11 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -794,7 +794,7 @@ void Server::AsyncRunStep(bool initial_step)
 
 		// Key = object id
 		// Value = data sent by object
-		std::map<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
+		UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
 
 		// Get active object messages from environment
 		for(;;) {
@@ -803,7 +803,7 @@ void Server::AsyncRunStep(bool initial_step)
 				break;
 
 			std::vector<ActiveObjectMessage>* message_list = NULL;
-			std::map<u16, std::vector<ActiveObjectMessage>* >::iterator n;
+			UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator n;
 			n = buffered_messages.find(aom.id);
 			if (n == buffered_messages.end()) {
 				message_list = new std::vector<ActiveObjectMessage>;
@@ -824,7 +824,7 @@ void Server::AsyncRunStep(bool initial_step)
 			std::string reliable_data;
 			std::string unreliable_data;
 			// Go through all objects in message buffer
-			for (std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+			for (UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
 					j = buffered_messages.begin();
 					j != buffered_messages.end(); ++j) {
 				// If object is not known by client, skip it
@@ -868,7 +868,7 @@ void Server::AsyncRunStep(bool initial_step)
 		m_clients.unlock();
 
 		// Clear buffered_messages
-		for(std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+		for(UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
 				i = buffered_messages.begin();
 				i != buffered_messages.end(); ++i) {
 			delete i->second;
diff --git a/src/util/string.h b/src/util/string.h
index 724543a36..572c37150 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define UTIL_STRING_HEADER
 
 #include "irrlichttypes_bloated.h"
+#include "cpp11_container.h"
 #include <stdlib.h>
 #include <string>
 #include <cstring>
@@ -54,7 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 	(((unsigned char)(x) < 0xe0) ? 2 :     \
 	(((unsigned char)(x) < 0xf0) ? 3 : 4))
 
-typedef std::map<std::string, std::string> StringMap;
+typedef UNORDERED_MAP<std::string, std::string> StringMap;
 
 struct FlagDesc {
 	const char *name;
-- 
GitLab