Browse Source

Reduce template instantiations of std::vector<std::string>

The new StringMap code for luax_enumerror causes code to be generated for
std::vector. By using an extern template (an old feature standardised in c++11)
we can instantiate it once instead, in StringMap.cpp.

--HG--
branch : minor
Bart van Strien 7 years ago
parent
commit
bf1a9344eb
3 changed files with 32 additions and 0 deletions
  1. 1 0
      CMakeLists.txt
  2. 25 0
      src/common/StringMap.cpp
  3. 6 0
      src/common/StringMap.h

+ 1 - 0
CMakeLists.txt

@@ -287,6 +287,7 @@ set(LOVE_SRC_COMMON
 	src/common/runtime.h
 	src/common/runtime.h
 	src/common/Stream.cpp
 	src/common/Stream.cpp
 	src/common/Stream.h
 	src/common/Stream.h
+	src/common/StringMap.cpp
 	src/common/StringMap.h
 	src/common/StringMap.h
 	src/common/types.cpp
 	src/common/types.cpp
 	src/common/types.h
 	src/common/types.h

+ 25 - 0
src/common/StringMap.cpp

@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2006-2017 LOVE Development Team
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ **/
+
+#include "StringMap.h"
+
+// See the header
+template class std::vector<std::string>;
+template decltype(std::vector<std::string>().emplace_back("")) std::vector<std::string>::emplace_back<const char *const&>(const char *const&);

+ 6 - 0
src/common/StringMap.h

@@ -26,6 +26,12 @@
 #include <string>
 #include <string>
 #include <vector>
 #include <vector>
 
 
+// As StringMap instantiates std::vector<std::string> for instances that use
+// getNames(), we end up with multiple copies in the object files. This
+// declaration means we only emit it once (in StringMap.cpp).
+extern template class std::vector<std::string>;
+extern template decltype(std::vector<std::string>().emplace_back("")) std::vector<std::string>::emplace_back<const char *const&>(const char *const&);
+
 namespace love
 namespace love
 {
 {