aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/iterator/enumerate.h
diff options
context:
space:
mode:
authordeep <deep@yandex-team.com>2024-11-22 12:07:07 +0300
committerdeep <deep@yandex-team.com>2024-11-22 12:22:03 +0300
commit06ad4bcf8a7b739bedbd565fc385c6273baaa346 (patch)
tree45249c203f3f54838895744042273731aad9f9e2 /library/cpp/iterator/enumerate.h
parent9478cfdab4217d3710b96329466825bf47111d7d (diff)
downloadydb-06ad4bcf8a7b739bedbd565fc385c6273baaa346.tar.gz
Signed Enumerate
commit_hash:af73a3ea146e2eb6141cb19913e534d75ba573fd
Diffstat (limited to 'library/cpp/iterator/enumerate.h')
-rw-r--r--library/cpp/iterator/enumerate.h17
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)};
}