Skip to content

Commit 0746d1e

Browse files
authored
Merge pull request #27493 from jrose-apple/this-isnt-even-my-final-form
Remove TransformArrayRef, FilterIterator, and FilterRange
2 parents 414a4e2 + 262f686 commit 0746d1e

File tree

7 files changed

+55
-291
lines changed

7 files changed

+55
-291
lines changed

include/swift/Basic/STLExtras.h

Lines changed: 16 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ inline Iterator prev_or_begin(Iterator it, Iterator begin) {
253253

254254
/// A range of iterators.
255255
/// TODO: Add `llvm::iterator_range::empty()`, then remove this helper, along
256-
/// with the superfluous FilterIterator and TransformIterator.
256+
/// with the superfluous TransformIterator.
257257
template<typename Iterator>
258258
class IteratorRange {
259259
Iterator First, Last;
@@ -279,136 +279,6 @@ makeIteratorRange(Iterator first, Iterator last) {
279279
return IteratorRange<Iterator>(first, last);
280280
}
281281

282-
/// An iterator that filters the results of an underlying forward
283-
/// iterator, only passing through those values that satisfy a predicate.
284-
///
285-
/// \tparam Iterator the underlying iterator.
286-
///
287-
/// \tparam Predicate A predicate that determines whether a value of the
288-
/// underlying iterator is available in the resulting sequence.
289-
template<typename Iterator, typename Predicate>
290-
class FilterIterator {
291-
Iterator Current, End;
292-
293-
/// FIXME: Could optimize away this storage with EBCO tricks.
294-
Predicate Pred;
295-
296-
/// Skip any non-matching elements.
297-
void skipNonMatching() {
298-
while (Current != End && !Pred(*Current))
299-
++Current;
300-
}
301-
302-
public:
303-
/// Used to indicate when the current iterator has already been
304-
/// "primed", meaning that it's at the end or points to a value that
305-
/// satisfies the predicate.
306-
enum PrimedT { Primed };
307-
308-
using iterator_category = std::forward_iterator_tag;
309-
using value_type = typename std::iterator_traits<Iterator>::value_type;
310-
using reference = typename std::iterator_traits<Iterator>::reference;
311-
using pointer = typename std::iterator_traits<Iterator>::pointer;
312-
using difference_type =
313-
typename std::iterator_traits<Iterator>::difference_type;
314-
315-
/// Construct a new filtering iterator for the given iterator range
316-
/// and predicate.
317-
FilterIterator(Iterator current, Iterator end, Predicate pred)
318-
: Current(current), End(end), Pred(pred)
319-
{
320-
// Prime the iterator.
321-
skipNonMatching();
322-
}
323-
324-
/// Construct a new filtering iterator for the given iterator range
325-
/// and predicate, where the iterator range has already been
326-
/// "primed" by ensuring that it is empty or the current iterator
327-
/// points to something that matches the predicate.
328-
FilterIterator(Iterator current, Iterator end, Predicate pred, PrimedT)
329-
: Current(current), End(end), Pred(pred)
330-
{
331-
// Assert that the iterators have already been primed.
332-
assert(Current == End || Pred(*Current) && "Not primed!");
333-
}
334-
335-
reference operator*() const {
336-
return *Current;
337-
}
338-
339-
pointer operator->() const {
340-
return Current.operator->();
341-
}
342-
343-
FilterIterator &operator++() {
344-
++Current;
345-
skipNonMatching();
346-
return *this;
347-
}
348-
349-
FilterIterator operator++(int) {
350-
FilterIterator old = *this;
351-
++*this;
352-
return old;
353-
}
354-
355-
friend bool operator==(FilterIterator lhs, FilterIterator rhs) {
356-
return lhs.Current == rhs.Current;
357-
}
358-
friend bool operator!=(FilterIterator lhs, FilterIterator rhs) {
359-
return !(lhs == rhs);
360-
}
361-
};
362-
363-
/// Create a new filter iterator.
364-
template<typename Iterator, typename Predicate>
365-
inline FilterIterator<Iterator, Predicate>
366-
makeFilterIterator(Iterator current, Iterator end, Predicate pred) {
367-
return FilterIterator<Iterator, Predicate>(current, end, pred);
368-
}
369-
370-
/// A range filtered by a specific predicate.
371-
template<typename Range, typename Predicate>
372-
class FilterRange {
373-
using Iterator = typename Range::iterator;
374-
375-
Iterator First, Last;
376-
Predicate Pred;
377-
378-
public:
379-
using iterator = FilterIterator<Iterator, Predicate>;
380-
381-
FilterRange(Range range, Predicate pred)
382-
: First(range.begin()), Last(range.end()), Pred(pred)
383-
{
384-
// Prime the sequence.
385-
while (First != Last && !Pred(*First))
386-
++First;
387-
}
388-
389-
iterator begin() const {
390-
return iterator(First, Last, Pred, iterator::Primed);
391-
}
392-
393-
iterator end() const {
394-
return iterator(Last, Last, Pred, iterator::Primed);
395-
}
396-
397-
bool empty() const { return First == Last; }
398-
399-
typename std::iterator_traits<iterator>::value_type front() const {
400-
assert(!empty() && "Front of empty range");
401-
return *begin();
402-
}
403-
};
404-
405-
/// Create a new filter range.
406-
template<typename Range, typename Predicate>
407-
inline FilterRange<Range, Predicate>
408-
makeFilterRange(Range range, Predicate pred) {
409-
return FilterRange<Range, Predicate>(range, pred);
410-
}
411-
412282
/// An iterator that transforms the result of an underlying bidirectional
413283
/// iterator with a given operation.
414284
///
@@ -488,7 +358,7 @@ class TransformRange {
488358
Operation Op;
489359

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

493363
TransformRange(Range range, Operation op)
494364
: Rng(range), Op(op) { }
@@ -497,6 +367,20 @@ class TransformRange {
497367
iterator end() const { return iterator(Rng.end(), Op); }
498368
bool empty() const { return begin() == end(); }
499369

370+
// The dummy template parameter keeps 'size()' from being eagerly
371+
// instantiated.
372+
template <typename Dummy = Range>
373+
typename function_traits<decltype(&Dummy::size)>::result_type
374+
size() const {
375+
return Rng.size();
376+
}
377+
378+
template <typename Index>
379+
typename function_traits<Operation>::result_type
380+
operator[](Index index) const {
381+
return Op(Rng[index]);
382+
}
383+
500384
typename std::iterator_traits<iterator>::value_type front() const {
501385
assert(!empty() && "Front of empty range");
502386
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

0 commit comments

Comments
 (0)