From 981ce8fa15afa11d083033240edb1daff29081c7 Mon Sep 17 00:00:00 2001 From: Jakub Kuderski Date: Tue, 28 Feb 2023 16:24:10 -0500 Subject: [PATCH] [ADT] Fix const-correctness issues in `zippy` This defines the iterator tuple based on the storage type of `zippy`, instead of its type arguments. This way, we can support temporaries that gets passed in and allow for them to be modified during iteration. Because the iterator types to the tuple storage can have different types when the storage is and isn't const, this defines a const iterator type and non-const `begin`/`end` functions. This way we avoid unintentional casts, e.g., trying to cast `vector::reference` to `vector::const_reference`, which may be unrelated types that are not convertible. This patch is a general and free-standing improvement but my primary use is in the implemention a version of `enumerate` that accepts multiple ranges: D144583. Reviewed By: dblaikie, zero9178 Differential Revision: https://reviews.llvm.org/D144834 --- llvm/include/llvm/ADT/STLExtras.h | 63 ++++++++++++---- llvm/unittests/ADT/IteratorTest.cpp | 108 +++++++++++++++++++++++++++- 2 files changed, 157 insertions(+), 14 deletions(-) diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index f1a6587ecc7f3..86d80354c9978 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -856,33 +856,70 @@ class zip_shortest : public zip_common, Iters...> { } }; +/// Helper to obtain the iterator types for the tuple storage within `zippy`. +template