diff options
author | deep <deep@yandex-team.com> | 2024-11-22 12:07:07 +0300 |
---|---|---|
committer | deep <deep@yandex-team.com> | 2024-11-22 12:22:03 +0300 |
commit | 06ad4bcf8a7b739bedbd565fc385c6273baaa346 (patch) | |
tree | 45249c203f3f54838895744042273731aad9f9e2 /library/cpp/iterator/enumerate.h | |
parent | 9478cfdab4217d3710b96329466825bf47111d7d (diff) | |
download | ydb-06ad4bcf8a7b739bedbd565fc385c6273baaa346.tar.gz |
Signed Enumerate
commit_hash:af73a3ea146e2eb6141cb19913e534d75ba573fd
Diffstat (limited to 'library/cpp/iterator/enumerate.h')
-rw-r--r-- | library/cpp/iterator/enumerate.h | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/library/cpp/iterator/enumerate.h b/library/cpp/iterator/enumerate.h index 6ebc12a0e7..4b6a43dad7 100644 --- a/library/cpp/iterator/enumerate.h +++ b/library/cpp/iterator/enumerate.h @@ -8,11 +8,11 @@ namespace NPrivate { - template <typename TContainer> + template <typename TContainer, typename TSize> struct TEnumerator { private: using TStorage = TAutoEmbedOrPtrPolicy<TContainer>; - using TValue = std::tuple<const std::size_t, decltype(*std::begin(std::declval<TContainer&>()))>; + using TValue = std::tuple<const TSize, decltype(*std::begin(std::declval<TContainer&>()))>; using TIteratorState = decltype(std::begin(std::declval<TContainer&>())); using TSentinelState = decltype(std::end(std::declval<TContainer&>())); @@ -55,7 +55,7 @@ namespace NPrivate { return Iterator_ == other.Iterator_; } - std::size_t Index_; + TSize Index_; TIteratorState Iterator_; }; @@ -72,7 +72,7 @@ namespace NPrivate { TSentinel end() const { if constexpr (TrivialSentinel) { - return TIterator{std::numeric_limits<std::size_t>::max(), std::end(*Storage_.Ptr())}; + return TIterator{std::numeric_limits<TSize>::max(), std::end(*Storage_.Ptr())}; } else { return TSentinel{std::end(*Storage_.Ptr())}; } @@ -86,5 +86,12 @@ namespace NPrivate { //! Usage: for (auto [i, x] : Enumerate(container)) {...} template <typename TContainerOrRef> auto Enumerate(TContainerOrRef&& container) { - return NPrivate::TEnumerator<TContainerOrRef>{std::forward<TContainerOrRef>(container)}; + return NPrivate::TEnumerator<TContainerOrRef, std::size_t>{std::forward<TContainerOrRef>(container)}; +} + +//! Usage: for (auto [i, x] : SEnumerate(container)) {...} +// The index is signed for codebases that prefer signed numerics (such as YTsaurus). +template <typename TContainerOrRef> +auto SEnumerate(TContainerOrRef&& container) { + return NPrivate::TEnumerator<TContainerOrRef, std::ptrdiff_t>{std::forward<TContainerOrRef>(container)}; } |