[ADT] Add `llvm::range_size` function for generic ranges
authorJakub Kuderski <kubakuderski@gmail.com>
Tue, 21 Mar 2023 16:58:17 +0000 (12:58 -0400)
committerJakub Kuderski <kubak@google.com>
Tue, 21 Mar 2023 16:58:18 +0000 (12:58 -0400)
commit2981832501f7bca6dc95ba54af68bdd1766629c4
tree34b66fbf7bf4a88c172bd7ac4248ad398c2dfc9c
parentb904e68f13ba7d4f4aa86a3495e2441c99247671
[ADT] Add `llvm::range_size` function for generic ranges

This function follows `std::ranges::size` from C++20. It is intended
mainly for generic code that does not know the exact range type.
I did not modify the existing `llvm::size` function because it has a strict
guarantee of O(1) running time, and we cannot guarantee that when we delegate
size check to user-defined size functions.

Use `range_size` to optimize size checks in `zip`* and `enumerate`
functions. Before that, we would have to perform linear scans for ranges
without random access iterators.

This is the last change I have planned in the series that overhauls
`zip`* and `enumerate`.

Reviewed By: dblaikie, zero9178

Differential Revision: https://reviews.llvm.org/D146231
llvm/include/llvm/ADT/STLExtras.h
llvm/unittests/ADT/IteratorTest.cpp
llvm/unittests/ADT/STLExtrasTest.cpp