layers: Fix white_list string comparison data

Existing extension name comparisons produced false positives when
extensions shared common roots. Moved to a set of explicit strings.

Change-Id: I2951927ddfaedce1e7a9784d3b261a1fab830103
diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp
index 7f5dbf5..e25a10e 100644
--- a/layers/vk_layer_utils.cpp
+++ b/layers/vk_layer_utils.cpp
@@ -73,12 +73,8 @@
     return result;
 }
 
-// Utility function for finding a text string in another string
-VK_LAYER_EXPORT bool white_list(const char *item, const char *list) {
-    std::string candidate(item);
-    std::string white_list(list);
-    return (white_list.find(candidate) != std::string::npos);
-}
+// Utility function for determining if a string is in a set of strings
+VK_LAYER_EXPORT bool white_list(const char *item, const std::set<std::string> &list) { return (list.find(item) != list.end()); }
 
 // Debug callbacks get created in three ways:
 //   o  Application-defined debug callbacks
diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h
index b4e95ac..710cc78 100644
--- a/layers/vk_layer_utils.h
+++ b/layers/vk_layer_utils.h
@@ -23,6 +23,7 @@
 #include <stdbool.h>
 #include <string>
 #include <vector>
+#include <set>
 #include "vk_format_utils.h"
 #include "vk_layer_logging.h"
 
@@ -134,7 +135,7 @@
                                                    const VkAllocationCallbacks *pAllocator, const char *layer_identifier);
 
 VK_LAYER_EXPORT VkStringErrorFlags vk_string_validate(const int max_length, const char *char_array);
-VK_LAYER_EXPORT bool white_list(const char *item, const char *whitelist);
+VK_LAYER_EXPORT bool white_list(const char *item, const std::set<std::string> &whitelist);
 
 static inline int u_ffs(int val) {
 #ifdef WIN32
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index e47d759..d4187ae 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -498,6 +498,7 @@
             '#include <string>',
             '#include <unordered_map>',
             '#include <utility>',
+            '#include <set>',
             '',
             '#include <vulkan/vulkan.h>',
             '']
@@ -638,9 +639,9 @@
                 '};'])
 
             # Output reference lists of instance/device extension names
-            struct.extend(['', 'static const char * const k%sExtensionNames = ' % type])
-            struct.extend([guarded(info['ifdef'], '    %s' % info['define']) for ext_name, info in extension_items])
-            struct.extend([';', ''])
+            struct.extend(['', 'static const std::set<std::string> k%sExtensionNames = {' % type])
+            struct.extend([guarded(info['ifdef'], '    %s,' % info['define']) for ext_name, info in extension_items])
+            struct.extend(['};', ''])
             output.extend(struct)
 
         output.extend(['', '#endif // VK_EXTENSION_HELPER_H_'])