Skip to content

Commit 8b8c88e

Browse files
committed
Improve swift::TransformRange enough to delete TransformArrayRef
We have a lot of "transform a range" types already: llvm::mapped_iterator, swift::TransformRange and swift::TransformIterator, and swift::ArrayRefView for static transformations. This gets rid of one more layer without losing any real functionality.
1 parent a59f438 commit 8b8c88e

File tree

7 files changed

+54
-160
lines changed

7 files changed

+54
-160
lines changed

include/swift/Basic/STLExtras.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ class TransformRange {
488488
Operation Op;
489489

490490
public:
491-
using iterator = TransformIterator<typename Range::iterator, Operation>;
491+
using iterator = TransformIterator<decltype(Rng.begin()), Operation>;
492492

493493
TransformRange(Range range, Operation op)
494494
: Rng(range), Op(op) { }
@@ -497,6 +497,20 @@ class TransformRange {
497497
iterator end() const { return iterator(Rng.end(), Op); }
498498
bool empty() const { return begin() == end(); }
499499

500+
// The dummy template parameter keeps 'size()' from being eagerly
501+
// instantiated.
502+
template <typename Dummy = Range>
503+
typename function_traits<decltype(&Dummy::size)>::result_type
504+
size() const {
505+
return Rng.size();
506+
}
507+
508+
template <typename Index>
509+
typename function_traits<Operation>::result_type
510+
operator[](Index index) const {
511+
return Op(Rng[index]);
512+
}
513+
500514
typename std::iterator_traits<iterator>::value_type front() const {
501515
assert(!empty() && "Front of empty range");
502516
return *begin();

include/swift/Basic/TransformArrayRef.h

Lines changed: 0 additions & 136 deletions
This file was deleted.

include/swift/SIL/SILArgumentArrayRef.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
#include "swift/Basic/LLVM.h"
2424
#include "swift/Basic/STLExtras.h"
25-
#include "swift/Basic/TransformArrayRef.h"
2625

2726
namespace swift {
2827

@@ -31,10 +30,11 @@ class SILPhiArgument;
3130
class SILFunctionArgument;
3231

3332
using PhiArgumentArrayRef =
34-
TransformArrayRef<function_ref<SILPhiArgument *(SILArgument *)>>;
33+
TransformRange<ArrayRef<SILArgument *>, SILPhiArgument *(*)(SILArgument *)>;
3534

3635
using FunctionArgumentArrayRef =
37-
TransformArrayRef<function_ref<SILFunctionArgument *(SILArgument *)>>;
36+
TransformRange<ArrayRef<SILArgument *>,
37+
SILFunctionArgument *(*)(SILArgument *)>;
3838

3939
} // namespace swift
4040

include/swift/SIL/SILBasicBlock.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
#include "swift/Basic/Compiler.h"
2121
#include "swift/Basic/Range.h"
22-
#include "swift/Basic/TransformArrayRef.h"
2322
#include "swift/SIL/SILArgumentArrayRef.h"
2423
#include "swift/SIL/SILInstruction.h"
2524

lib/SIL/SILOwnershipVerifier.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "swift/AST/Types.h"
2121
#include "swift/Basic/Range.h"
2222
#include "swift/Basic/STLExtras.h"
23-
#include "swift/Basic/TransformArrayRef.h"
2423
#include "swift/ClangImporter/ClangModule.h"
2524
#include "swift/SIL/BasicBlockUtils.h"
2625
#include "swift/SIL/BranchPropagatedUser.h"

unittests/Basic/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ add_swift_unittest(SwiftBasicTests
2727
StringExtrasTest.cpp
2828
SuccessorMapTest.cpp
2929
ThreadSafeRefCntPointerTest.cpp
30-
TransformArrayRefTest.cpp
30+
TransformRangeTest.cpp
3131
TreeScopedHashTableTest.cpp
3232
UnicodeTest.cpp
3333
ValueEnumeratorTest.cpp

unittests/Basic/TransformArrayRefTest.cpp renamed to unittests/Basic/TransformRangeTest.cpp

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
1-
//===--- TransformArrayRefTest.cpp ----------------------------------------===//
1+
//===--- TransformRangeTest.cpp -------------------------------------------===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
5-
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
5+
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
66
// Licensed under Apache License v2.0 with Runtime Library Exception
77
//
88
// See https://swift.org/LICENSE.txt for license information
99
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "swift/Basic/TransformArrayRef.h"
13+
#include "swift/Basic/STLExtras.h"
14+
#include "llvm/ADT/ArrayRef.h"
1415
#include "gtest/gtest.h"
1516

1617
using namespace swift;
1718

18-
TEST(TransformArrayRefTest, Empty) {
19+
TEST(TransformRangeTest, Empty) {
1920
auto transform = [](int i) -> float { return float(i); };
2021
std::function<float (int)> f(transform);
2122
std::vector<int> v1;
22-
auto EmptyArray = makeTransformArrayRef(llvm::ArrayRef<int>(v1), f);
23+
auto EmptyArray = makeTransformRange(llvm::ArrayRef<int>(v1), f);
2324
EXPECT_EQ(EmptyArray.empty(), v1.empty());
2425
}
2526

26-
TEST(TransformArrayRefTest, Subscript) {
27+
TEST(TransformRangeTest, Subscript) {
2728
auto transform = [](int i) -> float { return float(i); };
2829
std::function<float (int)> f(transform);
2930
std::vector<int> v1;
@@ -35,15 +36,15 @@ TEST(TransformArrayRefTest, Subscript) {
3536
v1.push_back(-5);
3637
v1.push_back(-30);
3738

38-
auto Array = makeTransformArrayRef(llvm::ArrayRef<int>(v1), f);
39+
auto Array = makeTransformRange(llvm::ArrayRef<int>(v1), f);
3940

4041
EXPECT_EQ(Array.size(), v1.size());
4142
for (unsigned i = 0, e = Array.size(); i != e; ++i) {
4243
EXPECT_EQ(Array[i], transform(v1[i]));
4344
}
4445
}
4546

46-
TEST(TransformArrayRefTest, Iteration) {
47+
TEST(TransformRangeTest, Iteration) {
4748
auto transform = [](int i) -> float { return float(i); };
4849
std::function<float (int)> f(transform);
4950
std::vector<int> v1;
@@ -55,7 +56,7 @@ TEST(TransformArrayRefTest, Iteration) {
5556
v1.push_back(-5);
5657
v1.push_back(-30);
5758

58-
auto Array = makeTransformArrayRef(llvm::ArrayRef<int>(v1), f);
59+
auto Array = makeTransformRange(llvm::ArrayRef<int>(v1), f);
5960

6061
auto VBegin = v1.begin();
6162
auto VIter = v1.begin();
@@ -83,7 +84,7 @@ TEST(TransformArrayRefTest, Iteration) {
8384
}
8485
}
8586

86-
TEST(TransformArrayRefTest, Slicing) {
87+
TEST(TransformRangeTest, IterationWithSizelessSubscriptlessRange) {
8788
auto transform = [](int i) -> float { return float(i); };
8889
std::function<float (int)> f(transform);
8990
std::vector<int> v1;
@@ -95,13 +96,30 @@ TEST(TransformArrayRefTest, Slicing) {
9596
v1.push_back(-5);
9697
v1.push_back(-30);
9798

98-
auto Array = llvm::ArrayRef<int>(v1);
99-
auto TArray = makeTransformArrayRef(Array, f);
99+
auto Array = makeTransformRange(llvm::make_range(v1.begin(), v1.end()), f);
100100

101-
EXPECT_EQ(Array.size(), TArray.size());
102-
while (!Array.empty()) {
103-
EXPECT_EQ(transform(*Array.begin()), *TArray.begin());
104-
Array = Array.slice(1);
105-
TArray = TArray.slice(1);
101+
auto VBegin = v1.begin();
102+
auto VIter = v1.begin();
103+
auto VEnd = v1.end();
104+
auto TBegin = Array.begin();
105+
auto TIter = Array.begin();
106+
auto TEnd = Array.end();
107+
108+
// Forwards.
109+
while (VIter != VEnd) {
110+
EXPECT_NE(TIter, TEnd);
111+
EXPECT_EQ(transform(*VIter), *TIter);
112+
++VIter;
113+
++TIter;
114+
}
115+
116+
// Backwards.
117+
while (VIter != VBegin) {
118+
EXPECT_NE(TIter, TBegin);
119+
120+
--VIter;
121+
--TIter;
122+
123+
EXPECT_EQ(transform(*VIter), *TIter);
106124
}
107125
}

0 commit comments

Comments
 (0)