aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/containers
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2024-01-31 17:22:33 +0300
committerAlexander Smirnov <alex@ydb.tech>2024-01-31 17:22:33 +0300
commit52be5dbdd420165c68e7e90ba8f1d2f00da041f6 (patch)
tree5d47f5b2ff4e6a7c8e75d33931a1e683949b7229 /library/cpp/yt/containers
parentea57c8867ceca391357c3c5ffcc5ba6738b49adc (diff)
parent809f0cf2fdfddfbeacc2256ffdbaaf5808ce5ed4 (diff)
downloadydb-52be5dbdd420165c68e7e90ba8f1d2f00da041f6.tar.gz
Merge branch 'mergelibs12' into main
Diffstat (limited to 'library/cpp/yt/containers')
-rw-r--r--library/cpp/yt/containers/enum_indexed_array-inl.h73
-rw-r--r--library/cpp/yt/containers/enum_indexed_array.h64
-rw-r--r--library/cpp/yt/containers/unittests/enum_indexed_array_ut.cpp45
-rw-r--r--library/cpp/yt/containers/unittests/sharded_set_ut.cpp6
-rw-r--r--library/cpp/yt/containers/unittests/ya.make5
5 files changed, 189 insertions, 4 deletions
diff --git a/library/cpp/yt/containers/enum_indexed_array-inl.h b/library/cpp/yt/containers/enum_indexed_array-inl.h
new file mode 100644
index 0000000000..edda891683
--- /dev/null
+++ b/library/cpp/yt/containers/enum_indexed_array-inl.h
@@ -0,0 +1,73 @@
+#pragma once
+#ifndef ENUM_INDEXED_ARRAY_INL_H_
+#error "Direct inclusion of this file is not allowed, include enum.h"
+// For the sake of sane code completion.
+#include "enum_indexed_array.h"
+#endif
+
+#include <library/cpp/yt/assert/assert.h>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <class E, class T, E Min, E Max>
+TEnumIndexedArray<E, T, Min, Max>::TEnumIndexedArray(std::initializer_list<std::pair<E, T>> elements)
+{
+ for (const auto& [index, value] : elements) {
+ (*this)[index] = value;
+ }
+}
+
+template <class E, class T, E Min, E Max>
+T& TEnumIndexedArray<E, T, Min, Max>::operator[] (E index)
+{
+ YT_ASSERT(IsValidIndex(index));
+ return Items_[ToUnderlying(index) - ToUnderlying(Min)];
+}
+
+template <class E, class T, E Min, E Max>
+const T& TEnumIndexedArray<E, T, Min, Max>::operator[] (E index) const
+{
+ return const_cast<TEnumIndexedArray&>(*this)[index];
+}
+
+template <class E, class T, E Min, E Max>
+T* TEnumIndexedArray<E, T, Min, Max>::begin()
+{
+ return Items_.data();
+}
+
+template <class E, class T, E Min, E Max>
+const T* TEnumIndexedArray<E, T, Min, Max>::begin() const
+{
+ return Items_.data();
+}
+
+template <class E, class T, E Min, E Max>
+T* TEnumIndexedArray<E, T, Min, Max>::end()
+{
+ return begin() + Size;
+}
+
+template <class E, class T, E Min, E Max>
+const T* TEnumIndexedArray<E, T, Min, Max>::end() const
+{
+ return begin() + Size;
+}
+
+template <class E, class T, E Min, E Max>
+constexpr size_t TEnumIndexedArray<E, T, Min, Max>::size() const
+{
+ return Size;
+}
+
+template <class E, class T, E Min, E Max>
+bool TEnumIndexedArray<E, T, Min, Max>::IsValidIndex(E index)
+{
+ return index >= Min && index <= Max;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/library/cpp/yt/containers/enum_indexed_array.h b/library/cpp/yt/containers/enum_indexed_array.h
new file mode 100644
index 0000000000..bae6a75237
--- /dev/null
+++ b/library/cpp/yt/containers/enum_indexed_array.h
@@ -0,0 +1,64 @@
+#pragma once
+
+#include <library/cpp/yt/misc/enum.h>
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+//! A statically sized vector with elements of type |T| indexed by
+//! the items of enumeration type |E|.
+/*!
+ * By default, valid indexes are in range from the minimum declared value of |E|
+ * to the maximum declared value of |E|.
+ *
+ * Items are value-initialized on construction.
+ */
+template <
+ class E,
+ class T,
+ E Min = TEnumTraits<E>::GetMinValue(),
+ E Max = TEnumTraits<E>::GetMaxValue()
+>
+class TEnumIndexedArray
+{
+public:
+ static_assert(Min <= Max);
+
+ using TIndex = E;
+ using TValue = T;
+
+ constexpr TEnumIndexedArray() = default;
+ TEnumIndexedArray(std::initializer_list<std::pair<E, T>> elements);
+
+ constexpr TEnumIndexedArray(const TEnumIndexedArray&) = default;
+ constexpr TEnumIndexedArray(TEnumIndexedArray&&) = default;
+
+ constexpr TEnumIndexedArray& operator=(const TEnumIndexedArray&) = default;
+ constexpr TEnumIndexedArray& operator=(TEnumIndexedArray&&) = default;
+
+ T& operator[] (E index);
+ const T& operator[] (E index) const;
+
+ // STL interop.
+ T* begin();
+ const T* begin() const;
+ T* end();
+ const T* end() const;
+
+ constexpr size_t size() const;
+
+ static bool IsValidIndex(E index);
+
+private:
+ static constexpr size_t Size = static_cast<size_t>(Max) - static_cast<size_t>(Min) + 1;
+ std::array<T, Size> Items_{};
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
+
+#define ENUM_INDEXED_ARRAY_INL_H_
+#include "enum_indexed_array-inl.h"
+#undef ENUM_INDEXED_ARRAY_INL_H_
diff --git a/library/cpp/yt/containers/unittests/enum_indexed_array_ut.cpp b/library/cpp/yt/containers/unittests/enum_indexed_array_ut.cpp
new file mode 100644
index 0000000000..a87c417d7d
--- /dev/null
+++ b/library/cpp/yt/containers/unittests/enum_indexed_array_ut.cpp
@@ -0,0 +1,45 @@
+#include <library/cpp/testing/gtest/gtest.h>
+
+#include <library/cpp/yt/containers/enum_indexed_array.h>
+
+namespace NYT {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+DEFINE_ENUM(EColor,
+ ((Red) (10))
+ ((Green)(20))
+ ((Blue) (30))
+);
+
+TEST(TEnumIndexedArrayTest, Size)
+{
+ TEnumIndexedArray<EColor, int> arr;
+ EXPECT_EQ(std::ssize(arr), 21);
+}
+
+TEST(TEnumIndexedArrayTest, IsValidIndex)
+{
+ TEnumIndexedArray<EColor, int> arr;
+ EXPECT_TRUE(arr.IsValidIndex(EColor::Red));
+ EXPECT_TRUE(arr.IsValidIndex(EColor::Green));
+ EXPECT_TRUE(arr.IsValidIndex(EColor::Blue));
+ EXPECT_TRUE(arr.IsValidIndex(static_cast<EColor>(11)));
+ EXPECT_FALSE(arr.IsValidIndex(static_cast<EColor>(9)));
+}
+
+TEST(TEnumIndexedArrayTest, Simple)
+{
+ TEnumIndexedArray<EColor, int> arr;
+ EXPECT_EQ(arr[EColor::Red], 0);
+ arr[EColor::Red] = 1;
+ EXPECT_EQ(arr[EColor::Red], 1);
+ EXPECT_EQ(arr[EColor::Blue], 0);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
+
diff --git a/library/cpp/yt/containers/unittests/sharded_set_ut.cpp b/library/cpp/yt/containers/unittests/sharded_set_ut.cpp
index 2c4f8c5935..a954ea5151 100644
--- a/library/cpp/yt/containers/unittests/sharded_set_ut.cpp
+++ b/library/cpp/yt/containers/unittests/sharded_set_ut.cpp
@@ -21,7 +21,7 @@ using TSet = TShardedSet<int, 16, TIntToShard>;
////////////////////////////////////////////////////////////////////////////////
-TEST(CompactSetTest, Insert)
+TEST(TShardedSetTest, Insert)
{
TSet set;
@@ -41,7 +41,7 @@ TEST(CompactSetTest, Insert)
EXPECT_EQ(0u, set.count(4));
}
-TEST(CompactSetTest, Erase)
+TEST(TShardedSetTest, Erase)
{
TSet set;
@@ -65,7 +65,7 @@ TEST(CompactSetTest, Erase)
EXPECT_EQ(0u, set.count(8));
}
-TEST(CompactSetTest, StressTest)
+TEST(TShardedSetTest, StressTest)
{
TSet set;
diff --git a/library/cpp/yt/containers/unittests/ya.make b/library/cpp/yt/containers/unittests/ya.make
index 3e7cfd4311..3ffc420658 100644
--- a/library/cpp/yt/containers/unittests/ya.make
+++ b/library/cpp/yt/containers/unittests/ya.make
@@ -1,8 +1,11 @@
-GTEST(unittester-containers)
+GTEST()
INCLUDE(${ARCADIA_ROOT}/library/cpp/yt/ya_cpp.make.inc)
+SIZE(MEDIUM)
+
SRCS(
+ enum_indexed_array_ut.cpp
sharded_set_ut.cpp
)