Use STL types for C++ output

This give us much nicer lookup for string keys, boundary checks
and better introspection when it comes to iteration.

Signed-off-by: Pierre Ossman <ossman@cendio.se>
diff --git a/tests/Makefile b/tests/Makefile
index b7e2d3f..e8a1f50 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -39,7 +39,7 @@
              osx2xkb.hh osx2xkb_name.hh \
              html2win32.hh html2win32_name.hh \
              osx.hh osx_name.hh
-	$(CC) -o $@ $^
+	$(CXX) -std=c++11 -o $@ $^
 osx2win32.hh: $(SOURCES)
 	$(GEN) --lang stdc++ code-map $(DATA) osx win32 > $@
 osx2win32_name.hh: $(SOURCES)
diff --git a/tests/stdc++.cc b/tests/stdc++.cc
index 71d4bcd..5e3e8f5 100644
--- a/tests/stdc++.cc
+++ b/tests/stdc++.cc
@@ -22,42 +22,18 @@
 #include "osx.hh"
 #include "osx_name.hh"
 
-#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
-
 int main(int argc, char** argv)
 {
-	unsigned i;
-
-	assert(code_map_osx_to_win32_len == ARRAY_SIZE(code_map_osx_to_win32));
 	assert(code_map_osx_to_win32[0x1d] == 0x30);
-	assert(name_map_osx_to_win32_len == ARRAY_SIZE(name_map_osx_to_win32));
 	assert(strcmp(name_map_osx_to_win32[0x1d], "VK_0") == 0);
 
-	assert(code_map_osx_to_xkb_len == ARRAY_SIZE(code_map_osx_to_xkb));
 	assert(strcmp(code_map_osx_to_xkb[0x1d], "AE10") == 0);
-	assert(name_map_osx_to_xkb_len == ARRAY_SIZE(name_map_osx_to_xkb));
 	assert(strcmp(name_map_osx_to_xkb[0x1d], "AE10") == 0);
 
-	assert(code_map_html_to_win32_len == ARRAY_SIZE(code_map_html_to_win32));
-	for (i = 0;i < code_map_html_to_win32_len;i++) {
-		if (strcmp(code_map_html_to_win32[i].from, "ControlLeft") == 0) {
-			assert(code_map_html_to_win32[i].to == 0x11);
-			break;
-		}
-	}
-	assert(i != code_map_html_to_win32_len);
-	assert(name_map_html_to_win32_len == ARRAY_SIZE(name_map_html_to_win32));
-	for (i = 0;i < name_map_html_to_win32_len;i++) {
-		if (strcmp(name_map_html_to_win32[i].from, "ControlLeft") == 0) {
-			assert(strcmp(name_map_html_to_win32[i].to, "VK_CONTROL") == 0);
-			break;
-		}
-	}
-	assert(i != name_map_html_to_win32_len);
+	assert(code_map_html_to_win32.at("ControlLeft") == 0x11);
+	assert(strcmp(name_map_html_to_win32.at("ControlLeft"), "VK_CONTROL") == 0);
 
-	assert(code_table_osx_len == ARRAY_SIZE(code_table_osx));
 	assert(code_table_osx[0x1d] == 0x3b);
-	assert(name_table_osx_len == ARRAY_SIZE(name_table_osx));
 	assert(strcmp(name_table_osx[0x1d], "Control") == 0);
 
 	return 0;
diff --git a/tools/keymap-gen b/tools/keymap-gen
index cb8b8fc..6536861 100755
--- a/tools/keymap-gen
+++ b/tools/keymap-gen
@@ -530,6 +530,19 @@
 
 class CppLanguageGenerator(CLanguageGenerator):
 
+    def _array_start_code(self, varname, length, fromtype, totype):
+        totypename = self.inttypename if totype == int else "const " + self.strtypename
+        if fromtype == int:
+            print("#include <vector>")
+            print("const std::vector<%s> %s = {" % (totypename, varname))
+        else:
+            print("#include <map>")
+            print("#include <string>")
+            print("const std::map<const std::string, %s> %s = {" % (totypename, varname))
+
+    def _array_end(self):
+        print("};")
+
     # designated initializers not available in C++
     def _array_entry_code(self, index, value, comment):
         if type(index) != int: