summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2022-11-03 10:33:52 +0330
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2022-11-17 20:13:04 +0330
commit48a4c9c1adb6c5b3e0e602d3d8214291eea6b429 (patch)
treec56f2996a4c067da4b756c90b1c91878ffcfd050 /AK
parent6970bf03a963e9408bdf5a9cb7e377ea5a91545d (diff)
downloadserenity-48a4c9c1adb6c5b3e0e602d3d8214291eea6b429.zip
AK: Use TypedTransfer to move vector's inline buffer
This avoids an explicit loop-move when the type is trivial.
Diffstat (limited to 'AK')
-rw-r--r--AK/TypedTransfer.h17
-rw-r--r--AK/Vector.h6
2 files changed, 17 insertions, 6 deletions
diff --git a/AK/TypedTransfer.h b/AK/TypedTransfer.h
index 64ed7fb274..80625b0f3c 100644
--- a/AK/TypedTransfer.h
+++ b/AK/TypedTransfer.h
@@ -31,7 +31,7 @@ public:
}
}
- static size_t copy(T* destination, const T* source, size_t count)
+ static size_t copy(T* destination, T const* source, size_t count)
{
if (count == 0)
return 0;
@@ -54,7 +54,7 @@ public:
return count;
}
- static bool compare(const T* a, const T* b, size_t count)
+ static bool compare(T const* a, T const* b, size_t count)
{
if (count == 0)
return true;
@@ -69,6 +69,19 @@ public:
return true;
}
+
+ static void delete_(T* ptr, size_t count)
+ {
+ if (count == 0)
+ return;
+
+ if constexpr (Traits<T>::is_trivial()) {
+ return;
+ }
+
+ for (size_t i = 0; i < count; ++i)
+ ptr[i].~T();
+ }
};
}
diff --git a/AK/Vector.h b/AK/Vector.h
index c56761e369..1b4c4713fa 100644
--- a/AK/Vector.h
+++ b/AK/Vector.h
@@ -73,10 +73,8 @@ public:
{
if constexpr (inline_capacity > 0) {
if (!m_outline_buffer) {
- for (size_t i = 0; i < m_size; ++i) {
- new (&inline_buffer()[i]) StorageType(move(other.inline_buffer()[i]));
- other.inline_buffer()[i].~StorageType();
- }
+ TypedTransfer<T>::move(inline_buffer(), other.inline_buffer(), m_size);
+ TypedTransfer<T>::delete_(other.inline_buffer(), m_size);
}
}
other.m_outline_buffer = nullptr;