mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 09:00:22 +00:00
Vector: Use memcmp for comparing two vectors with trivial elements
This commit is contained in:
parent
6d97caf124
commit
e8e85f5457
Notes:
sideshowbarker
2024-07-19 12:50:41 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/e8e85f5457a
3 changed files with 39 additions and 8 deletions
|
@ -142,4 +142,29 @@ TEST_CASE(prepend_vector_object)
|
||||||
EXPECT_EQ(objects[5].subobject->value, 3);
|
EXPECT_EQ(objects[5].subobject->value, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE(vector_compare)
|
||||||
|
{
|
||||||
|
Vector<int> ints;
|
||||||
|
Vector<int> same_ints;
|
||||||
|
|
||||||
|
for (int i = 0; i < 1000; ++i) {
|
||||||
|
ints.append(i);
|
||||||
|
same_ints.append(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ(ints.size(), 1000);
|
||||||
|
EXPECT_EQ(ints, same_ints);
|
||||||
|
|
||||||
|
Vector<String> strings;
|
||||||
|
Vector<String> same_strings;
|
||||||
|
|
||||||
|
for (int i = 0; i < 1000; ++i) {
|
||||||
|
strings.append(String::number(i));
|
||||||
|
same_strings.append(String::number(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ(strings.size(), 1000);
|
||||||
|
EXPECT_EQ(strings, same_strings);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_MAIN(Vector)
|
TEST_MAIN(Vector)
|
||||||
|
|
|
@ -7,12 +7,12 @@ namespace AK {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct GenericTraits {
|
struct GenericTraits {
|
||||||
|
static constexpr bool is_trivial() { return false; }
|
||||||
static bool equals(const T& a, const T& b) { return a == b; }
|
static bool equals(const T& a, const T& b) { return a == b; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct Traits : public GenericTraits<T> {
|
struct Traits : public GenericTraits<T> {
|
||||||
static constexpr bool is_trivial() { return false; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
20
AK/Vector.h
20
AK/Vector.h
|
@ -85,6 +85,18 @@ public:
|
||||||
for (size_t i = 0; i < count; ++i)
|
for (size_t i = 0; i < count; ++i)
|
||||||
new (&destination[i]) T(source[i]);
|
new (&destination[i]) T(source[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool compare(const T* a, const T* b, size_t count)
|
||||||
|
{
|
||||||
|
if constexpr (Traits<T>::is_trivial())
|
||||||
|
return !memcmp(a, b, count * sizeof(T));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < count; ++i) {
|
||||||
|
if (a[i] != b[i])
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T, int inline_capacity = 0>
|
template<typename T, int inline_capacity = 0>
|
||||||
|
@ -178,13 +190,7 @@ public:
|
||||||
{
|
{
|
||||||
if (m_size != other.m_size)
|
if (m_size != other.m_size)
|
||||||
return false;
|
return false;
|
||||||
|
return TypedTransfer<T>::compare(data(), other.data(), size());
|
||||||
for (int i = 0; i < m_size; ++i) {
|
|
||||||
if (at(i) != other.at(i))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator!=(const Vector& other) const
|
bool operator!=(const Vector& other) const
|
||||||
|
|
Loading…
Reference in a new issue