diff options
| author | deep <[email protected]> | 2024-11-22 12:07:07 +0300 | 
|---|---|---|
| committer | deep <[email protected]> | 2024-11-22 12:22:03 +0300 | 
| commit | 06ad4bcf8a7b739bedbd565fc385c6273baaa346 (patch) | |
| tree | 45249c203f3f54838895744042273731aad9f9e2 /library/cpp | |
| parent | 9478cfdab4217d3710b96329466825bf47111d7d (diff) | |
Signed Enumerate
commit_hash:af73a3ea146e2eb6141cb19913e534d75ba573fd
Diffstat (limited to 'library/cpp')
| -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 6ebc12a0e7d..4b6a43dad78 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)};  } | 
