layers: Add new ranged_enum_array val routine

Change-Id: I2b78d90bd248a6800f719ef89c534140cb217ad8
diff --git a/layers/parameter_validation_utils.h b/layers/parameter_validation_utils.h
index 29ac542..a1cbb9a 100644
--- a/layers/parameter_validation_utils.h
+++ b/layers/parameter_validation_utils.h
@@ -715,6 +715,30 @@
     return skip_call;
 }
 
+template <typename T>
+static bool validate_ranged_enum_array(debug_report_data *report_data, const char *apiName, const ParameterName &countName,
+                                       const ParameterName &arrayName, const char *enumName, const std::vector<T> &valid_values,
+                                       uint32_t count, const T *array, bool countRequired, bool arrayRequired) {
+    bool skip_call = false;
+
+    if ((count == 0) || (array == NULL)) {
+        skip_call |= validate_array(report_data, apiName, countName, arrayName, count, array, countRequired, arrayRequired,
+                                    VALIDATION_ERROR_UNDEFINED, VALIDATION_ERROR_UNDEFINED);
+    } else {
+        for (uint32_t i = 0; i < count; ++i) {
+            if (std::find(valid_values.begin(), valid_values.end(), array[i]) == valid_values.end()) {
+                skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+                                     __LINE__, UNRECOGNIZED_VALUE, LayerName,
+                                     "%s: value of %s[%d] (%d) does not fall within the begin..end range of the core %s "
+                                     "enumeration tokens and is not an extension added token",
+                                     apiName, arrayName.get_name().c_str(), i, array[i], enumName);
+            }
+        }
+    }
+
+    return skip_call;
+}
+
 /**
 * Verify that a reserved VkFlags value is zero.
 *