diff options
author | Florian Hahn <flo@fhahn.com> | 2025-04-30 12:56:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-30 12:56:59 +0100 |
commit | 101fd87f98c9354103311db9523bc00b9df71d18 (patch) | |
tree | ae0598d2f6eabb77a953ada7c285dec13938472b /llvm/unittests/ADT/ArrayRefTest.cpp | |
parent | 120e940356561035bf37bc4fcb6fab771e7a9b7d (diff) | |
download | llvm-101fd87f98c9354103311db9523bc00b9df71d18.zip llvm-101fd87f98c9354103311db9523bc00b9df71d18.tar.gz llvm-101fd87f98c9354103311db9523bc00b9df71d18.tar.bz2 |
[ArrayRef] Add constructor from iterator_range<U*> (NFC). (#137796)
Add a new constructor to ArrayRef that takes an iterator_range with a
random access iterator that can be converted.
This can help to avoid creating unnecessary iterator_ranges for types
where an ArrayRef can already be constructed. To be used in
https://github.com/llvm/llvm-project/pull/137798.
PR: https://github.com/llvm/llvm-project/pull/137796
Diffstat (limited to 'llvm/unittests/ADT/ArrayRefTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/ArrayRefTest.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp index fb25ee1..a9d682c 100644 --- a/llvm/unittests/ADT/ArrayRefTest.cpp +++ b/llvm/unittests/ADT/ArrayRefTest.cpp @@ -255,6 +255,64 @@ TEST(ArrayRefTest, ArrayRefFromStdArray) { } } +struct TestRandomAccessIterator { + using iterator_category = std::random_access_iterator_tag; +}; + +static_assert(!std::is_constructible_v< + ArrayRef<int>, iterator_range<TestRandomAccessIterator>>, + "cannot construct from iterator range with non-pointer iterator"); +static_assert(!std::is_constructible_v<ArrayRef<int>, iterator_range<int>>, + "cannot construct from iterator range with non-pointer iterator"); + +class TestBase {}; + +class TestDerived : public TestBase {}; + +static_assert( + !std::is_constructible_v<ArrayRef<TestDerived>, iterator_range<TestBase *>>, + "cannot construct ArrayRef with derived type"); +static_assert( + !std::is_constructible_v<ArrayRef<TestBase>, iterator_range<TestDerived *>>, + "cannot construct ArrayRef base type"); +static_assert(!std::is_constructible_v<ArrayRef<TestBase *>, + iterator_range<TestDerived **>>, + "cannot construct ArrayRef pointer of base type"); + +static_assert( + !std::is_constructible_v<ArrayRef<int>, iterator_range<const int *>>, + "cannot construct ArrayRef with non-const elements from const iterator " + "range"); +static_assert( + std::is_constructible_v<ArrayRef<char *>, iterator_range<char **>>, + "should be able to construct ArrayRef from iterator_range over pointers"); +static_assert( + !std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>, + "should be able to construct ArrayRef from iterator_range over pointers"); + +TEST(ArrayRefTest, ArrayRefFromIteratorRange) { + std::array<int, 5> A1{{42, -5, 0, 1000000, -1000000}}; + ArrayRef<int> A2 = make_range(A1.begin(), A1.end()); + + EXPECT_EQ(A1.size(), A2.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A2[i]); + + ArrayRef<const int> A3 = make_range(A1.begin(), A1.end()); + EXPECT_EQ(A1.size(), A3.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A3[i]); +} + +TEST(ArrayRefTest, ArrayRefFromIteratorConstRange) { + std::array<const int, 5> A1{{42, -5, 0, 1000000, -1000000}}; + ArrayRef<const int> A2 = make_range(A1.begin(), A1.end()); + + EXPECT_EQ(A1.size(), A2.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A2[i]); +} + static_assert(std::is_trivially_copyable_v<ArrayRef<int>>, "trivially copyable"); |