From c0d3bdc0cac39f9a7a1ba5327b694f7b4350faeb Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Fri, 16 Jul 2021 00:28:05 +0800 Subject: [PATCH] Add list initialization support for Vector & LocalVector --- core/templates/local_vector.h | 8 ++++++++ core/templates/vector.h | 11 +++++++++++ drivers/vulkan/vulkan_context.cpp | 8 ++++---- tests/core/templates/test_local_vector.h | 11 +++++++++++ tests/core/templates/test_vector.h | 11 +++++++++++ 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index 1a19f29f3b1f..f4e0748c275d 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -36,6 +36,8 @@ #include "core/templates/sort_array.h" #include "core/templates/vector.h" +#include + template class LocalVector { private: @@ -228,6 +230,12 @@ public: } _FORCE_INLINE_ LocalVector() {} + _FORCE_INLINE_ LocalVector(std::initializer_list p_init) { + reserve(p_init.size()); + for (const T &element : p_init) { + push_back(element); + } + } _FORCE_INLINE_ LocalVector(const LocalVector &p_from) { resize(p_from.size()); for (U i = 0; i < p_from.count; i++) { diff --git a/core/templates/vector.h b/core/templates/vector.h index 18b731c458c8..4ada3b597ad7 100644 --- a/core/templates/vector.h +++ b/core/templates/vector.h @@ -43,6 +43,8 @@ #include "core/templates/search_array.h" #include "core/templates/sort_array.h" +#include + template class VectorWriteProxy { public: @@ -258,6 +260,15 @@ public: } _FORCE_INLINE_ Vector() {} + _FORCE_INLINE_ Vector(std::initializer_list p_init) { + Error err = _cowdata.resize(p_init.size()); + ERR_FAIL_COND(err); + + int i = 0; + for (const T &element : p_init) { + _cowdata.set(i++, element); + } + } _FORCE_INLINE_ Vector(const Vector &p_from) { _cowdata._ref(p_from._cowdata); } _FORCE_INLINE_ ~Vector() {} diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 102787f0bffb..75a3ab26eaea 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -33,6 +33,7 @@ #include "core/config/engine.h" #include "core/config/project_settings.h" #include "core/string/ustring.h" +#include "core/templates/local_vector.h" #include "core/version.h" #include "servers/rendering/rendering_device.h" @@ -41,7 +42,6 @@ #include #include #include -#include #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) #define APP_SHORT_NAME "GodotEngine" @@ -212,7 +212,7 @@ VkBool32 VulkanContext::_check_layers(uint32_t check_count, const char *const *c } Error VulkanContext::_get_preferred_validation_layers(uint32_t *count, const char *const **names) { - static const std::vector> instance_validation_layers_alt{ + static const LocalVector> instance_validation_layers_alt{ // Preferred set of validation layers { "VK_LAYER_KHRONOS_validation" }, @@ -249,10 +249,10 @@ Error VulkanContext::_get_preferred_validation_layers(uint32_t *count, const cha } for (uint32_t i = 0; i < instance_validation_layers_alt.size(); i++) { - if (_check_layers(instance_validation_layers_alt[i].size(), instance_validation_layers_alt[i].data(), instance_layer_count, instance_layers)) { + if (_check_layers(instance_validation_layers_alt[i].size(), instance_validation_layers_alt[i].ptr(), instance_layer_count, instance_layers)) { *count = instance_validation_layers_alt[i].size(); if (names != nullptr) { - *names = instance_validation_layers_alt[i].data(); + *names = instance_validation_layers_alt[i].ptr(); } break; } diff --git a/tests/core/templates/test_local_vector.h b/tests/core/templates/test_local_vector.h index ca4a69b06985..b2464c391419 100644 --- a/tests/core/templates/test_local_vector.h +++ b/tests/core/templates/test_local_vector.h @@ -37,6 +37,17 @@ namespace TestLocalVector { +TEST_CASE("[LocalVector] List Initialization.") { + LocalVector vector{ 0, 1, 2, 3, 4 }; + + CHECK(vector.size() == 5); + CHECK(vector[0] == 0); + CHECK(vector[1] == 1); + CHECK(vector[2] == 2); + CHECK(vector[3] == 3); + CHECK(vector[4] == 4); +} + TEST_CASE("[LocalVector] Push Back.") { LocalVector vector; vector.push_back(0); diff --git a/tests/core/templates/test_vector.h b/tests/core/templates/test_vector.h index b0dcff93fdbc..24b3547256bc 100644 --- a/tests/core/templates/test_vector.h +++ b/tests/core/templates/test_vector.h @@ -37,6 +37,17 @@ namespace TestVector { +TEST_CASE("[Vector] List initialization") { + Vector vector{ 0, 1, 2, 3, 4 }; + + CHECK(vector.size() == 5); + CHECK(vector[0] == 0); + CHECK(vector[1] == 1); + CHECK(vector[2] == 2); + CHECK(vector[3] == 3); + CHECK(vector[4] == 4); +} + TEST_CASE("[Vector] Push back and append") { Vector vector; vector.push_back(0);