aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorvadim-xd <vadim-xd@yandex-team.com>2025-03-05 13:38:13 +0300
committervadim-xd <vadim-xd@yandex-team.com>2025-03-05 13:56:24 +0300
commit51f0d168cd2bc8ee1021d398e14ac88dcf0a38ec (patch)
tree99ab696870ab128713d9e2c8adf07d1c9cc22261 /library/cpp
parent9eed360f02de773a5ed2de5d2a3e81fc7f06acfa (diff)
downloadydb-51f0d168cd2bc8ee1021d398e14ac88dcf0a38ec.tar.gz
Add new methods for TCompactVector
commit_hash:dc7ab41cade426d450efbc68b6cd72e045e3f69e
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/containers/compact_vector/compact_vector.h24
-rw-r--r--library/cpp/containers/compact_vector/compact_vector_ut.cpp35
2 files changed, 56 insertions, 3 deletions
diff --git a/library/cpp/containers/compact_vector/compact_vector.h b/library/cpp/containers/compact_vector/compact_vector.h
index 984ec6ac00..cff5345ee2 100644
--- a/library/cpp/containers/compact_vector/compact_vector.h
+++ b/library/cpp/containers/compact_vector/compact_vector.h
@@ -113,6 +113,14 @@ public:
return *this;
}
+ bool operator==(const TCompactVector<T>& other) const {
+ return size() == other.size() && std::equal(begin(), end(), other.begin());
+ }
+
+ explicit operator bool() const {
+ return !empty();
+ }
+
TIterator Begin() {
return Ptr;
}
@@ -218,15 +226,25 @@ public:
}
void PushBack(const T& elem) {
- Reserve(Size() + 1);
- new (Ptr + Size()) T(elem);
- ++(Header()->Size);
+ EmplaceBack(elem);
}
void push_back(const T& elem) {
PushBack(elem);
}
+ template <class... Args>
+ void EmplaceBack(Args&&... args) {
+ Reserve(Size() + 1);
+ new (Ptr + Size()) T(std::forward<Args>(args)...);
+ ++(Header()->Size);
+ }
+
+ template <class... Args>
+ void emplace_back(Args&&... args) {
+ EmplaceBack(std::forward<Args>(args)...);
+ }
+
T& Back() {
return *(End() - 1);
}
diff --git a/library/cpp/containers/compact_vector/compact_vector_ut.cpp b/library/cpp/containers/compact_vector/compact_vector_ut.cpp
index 4dba7b2f49..5aac5303f3 100644
--- a/library/cpp/containers/compact_vector/compact_vector_ut.cpp
+++ b/library/cpp/containers/compact_vector/compact_vector_ut.cpp
@@ -2,6 +2,8 @@
#include "compact_vector.h"
+#include <string>
+
Y_UNIT_TEST_SUITE(TCompactVectorTest) {
Y_UNIT_TEST(TestSimple1) {
}
@@ -44,6 +46,28 @@ Y_UNIT_TEST_SUITE(TCompactVectorTest) {
UNIT_ASSERT_VALUES_EQUAL(11u, vector[11]);
}
+ Y_UNIT_TEST(TestEmplace) {
+ struct TFoo {
+ explicit TFoo(int)
+ : ConstructedFrom("int")
+ {
+ }
+
+ explicit TFoo(char)
+ : ConstructedFrom("char")
+ {
+ }
+
+ std::string ConstructedFrom;
+ };
+
+ TCompactVector<TFoo> vector;
+ vector.emplace_back(123);
+ UNIT_ASSERT_VALUES_EQUAL(vector.back().ConstructedFrom, "int");
+ vector.emplace_back('c');
+ UNIT_ASSERT_VALUES_EQUAL(vector.back().ConstructedFrom, "char");
+ }
+
Y_UNIT_TEST(TestInitializerListConstructor) {
TCompactVector<ui32> vector = { 4, 8, 10, 3, 5};
UNIT_ASSERT_VALUES_EQUAL(5u, vector.Size());
@@ -146,4 +170,15 @@ Y_UNIT_TEST_SUITE(TCompactVectorTest) {
UNIT_ASSERT_VALUES_EQUAL(vector[1], vector2[1]);
UNIT_ASSERT_VALUES_EQUAL(vector[2], vector2[2]);
}
+
+ Y_UNIT_TEST(TestComparison) {
+ // UNIT_ASSERT_VALUES_EQUAL needs a specialization for Out(), so we just use bool assertions
+ TCompactVector<int> vector {1, 2, 3};
+ TCompactVector<int> vector2 {1, 2};
+ UNIT_ASSERT(vector != vector2); // diff size
+ vector2.emplace_back(4);
+ UNIT_ASSERT(vector != vector2); // diff values
+ vector2.back() = 3;
+ UNIT_ASSERT(vector == vector2);
+ }
}