From a636c04244669b62abce3e9094b3420ba6c3cdb3 Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Mon, 16 Dec 2024 17:28:47 +0100 Subject: [PATCH] Optimize `CowData` and `LocalVector` functions `.insert` and `.remove_at` by using move semantics. --- core/templates/cowdata.h | 5 +++-- core/templates/local_vector.h | 12 ++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/templates/cowdata.h b/core/templates/cowdata.h index f87fa1ad811..2cb3b9bc1f4 100644 --- a/core/templates/cowdata.h +++ b/core/templates/cowdata.h @@ -37,6 +37,7 @@ #include #include +#include template class Vector; @@ -224,7 +225,7 @@ public: T *p = ptrw(); Size len = size(); for (Size i = p_index; i < len - 1; i++) { - p[i] = p[i + 1]; + p[i] = std::move(p[i + 1]); } resize(len - 1); @@ -237,7 +238,7 @@ public: ERR_FAIL_COND_V(err, err); T *p = ptrw(); for (Size i = new_size - 1; i > p_pos; i--) { - p[i] = p[i - 1]; + p[i] = std::move(p[i - 1]); } p[p_pos] = p_val; diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index c281d70d928..1fa3be02823 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -67,7 +67,7 @@ public: if constexpr (!std::is_trivially_constructible_v && !force_trivial) { memnew_placement(&data[count++], T(p_elem)); } else { - data[count++] = p_elem; + data[count++] = std::move(p_elem); } } @@ -75,7 +75,7 @@ public: ERR_FAIL_UNSIGNED_INDEX(p_index, count); count--; for (U i = p_index; i < count; i++) { - data[i] = data[i + 1]; + data[i] = std::move(data[i + 1]); } if constexpr (!std::is_trivially_destructible_v && !force_trivial) { data[count].~T(); @@ -88,7 +88,7 @@ public: ERR_FAIL_INDEX(p_index, count); count--; if (count > p_index) { - data[p_index] = data[count]; + data[p_index] = std::move(data[count]); } if constexpr (!std::is_trivially_destructible_v && !force_trivial) { data[count].~T(); @@ -245,13 +245,13 @@ public: void insert(U p_pos, T p_val) { ERR_FAIL_UNSIGNED_INDEX(p_pos, count + 1); if (p_pos == count) { - push_back(p_val); + push_back(std::move(p_val)); } else { resize(count + 1); for (U i = count - 1; i > p_pos; i--) { - data[i] = data[i - 1]; + data[i] = std::move(data[i - 1]); } - data[p_pos] = p_val; + data[p_pos] = std::move(p_val); } }