diff options
author | Alexander Smirnov <alex@ydb.tech> | 2024-01-31 17:22:33 +0300 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2024-01-31 17:22:33 +0300 |
commit | 52be5dbdd420165c68e7e90ba8f1d2f00da041f6 (patch) | |
tree | 5d47f5b2ff4e6a7c8e75d33931a1e683949b7229 /library/cpp/yt/containers | |
parent | ea57c8867ceca391357c3c5ffcc5ba6738b49adc (diff) | |
parent | 809f0cf2fdfddfbeacc2256ffdbaaf5808ce5ed4 (diff) | |
download | ydb-52be5dbdd420165c68e7e90ba8f1d2f00da041f6.tar.gz |
Merge branch 'mergelibs12' into main
Diffstat (limited to 'library/cpp/yt/containers')
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 ) |