Skip to content

Commit 4db904b

Browse files
committed
Revert "[ADT] Add zip_longest iterators"
This reverts commit r348301. Compilation fails on buildbots with older versions of gcc and msvc. llvm-svn: 348303
1 parent 86c804d commit 4db904b

File tree

2 files changed

+1
-155
lines changed

2 files changed

+1
-155
lines changed

llvm/include/llvm/ADT/STLExtras.h

Lines changed: 1 addition & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -508,11 +508,9 @@ make_early_inc_range(RangeT &&Range) {
508508
EarlyIncIteratorT(std::end(std::forward<RangeT>(Range))));
509509
}
510510

511-
// forward declarations required by zip_shortest/zip_first/zip_longest
511+
// forward declarations required by zip_shortest/zip_first
512512
template <typename R, typename UnaryPredicate>
513513
bool all_of(R &&range, UnaryPredicate P);
514-
template <typename R, typename UnaryPredicate>
515-
bool any_of(R &&range, UnaryPredicate P);
516514

517515
template <size_t... I> struct index_sequence;
518516

@@ -663,128 +661,6 @@ detail::zippy<detail::zip_first, T, U, Args...> zip_first(T &&t, U &&u,
663661
std::forward<T>(t), std::forward<U>(u), std::forward<Args>(args)...);
664662
}
665663

666-
namespace detail {
667-
template <typename Iter>
668-
static Iter next_or_end(const Iter &I, const Iter &End) {
669-
if (I == End)
670-
return End;
671-
return std::next(I);
672-
}
673-
674-
template <typename Iter>
675-
static auto deref_or_none(const Iter &I, const Iter &End)
676-
-> llvm::Optional<typename std::remove_const<
677-
typename std::remove_reference<decltype(*I)>::type>::type> {
678-
if (I == End)
679-
return None;
680-
return *I;
681-
}
682-
683-
template <typename... Iters> struct ZipLongestValueType {
684-
using type = std::tuple<
685-
llvm::Optional<typename std::remove_const<typename std::remove_reference<
686-
decltype(*std::declval<Iters>())>::type>::type>...>;
687-
};
688-
689-
template <typename... Iters>
690-
class zip_longest_iterator
691-
: public iterator_facade_base<
692-
zip_longest_iterator<Iters...>,
693-
typename std::common_type<
694-
std::forward_iterator_tag,
695-
typename std::iterator_traits<Iters>::iterator_category...>::type,
696-
typename ZipLongestValueType<Iters...>::type,
697-
typename std::iterator_traits<typename std::tuple_element<
698-
0, std::tuple<Iters...>>::type>::difference_type,
699-
typename ZipLongestValueType<Iters...>::type *,
700-
typename ZipLongestValueType<Iters...>::type> {
701-
public:
702-
using value_type = typename ZipLongestValueType<Iters...>::type;
703-
704-
private:
705-
std::tuple<Iters...> iterators;
706-
std::tuple<Iters...> end_iterators;
707-
708-
template <size_t... Ns>
709-
bool test(const zip_longest_iterator<Iters...> &other,
710-
index_sequence<Ns...>) const {
711-
return llvm::any_of(
712-
std::initializer_list<bool>{std::get<Ns>(this->iterators) !=
713-
std::get<Ns>(other.iterators)...},
714-
identity<bool>{});
715-
}
716-
717-
template <size_t... Ns> value_type deref(index_sequence<Ns...>) const {
718-
return value_type(
719-
deref_or_none(std::get<Ns>(iterators), std::get<Ns>(end_iterators))...);
720-
}
721-
722-
template <size_t... Ns>
723-
decltype(iterators) tup_inc(index_sequence<Ns...>) const {
724-
return std::tuple<Iters...>(
725-
next_or_end(std::get<Ns>(iterators), std::get<Ns>(end_iterators))...);
726-
}
727-
728-
public:
729-
zip_longest_iterator(std::pair<Iters &&, Iters &&>... ts)
730-
: iterators(std::forward<Iters>(ts.first)...),
731-
end_iterators(std::forward<Iters>(ts.second)...) {}
732-
733-
value_type operator*() { return deref(index_sequence_for<Iters...>{}); }
734-
735-
value_type operator*() const { return deref(index_sequence_for<Iters...>{}); }
736-
737-
zip_longest_iterator<Iters...> &operator++() {
738-
iterators = tup_inc(index_sequence_for<Iters...>{});
739-
return *this;
740-
}
741-
742-
bool operator==(const zip_longest_iterator<Iters...> &other) const {
743-
return !test(other, index_sequence_for<Iters...>{});
744-
}
745-
};
746-
747-
template <typename... Args> class zip_longest_range {
748-
public:
749-
using iterator =
750-
zip_longest_iterator<decltype(adl_begin(std::declval<Args>()))...>;
751-
using iterator_category = typename iterator::iterator_category;
752-
using value_type = typename iterator::value_type;
753-
using difference_type = typename iterator::difference_type;
754-
using pointer = typename iterator::pointer;
755-
using reference = typename iterator::reference;
756-
757-
private:
758-
std::tuple<Args...> ts;
759-
760-
template <size_t... Ns> iterator begin_impl(index_sequence<Ns...>) const {
761-
return iterator(std::make_pair(adl_begin(std::get<Ns>(ts)),
762-
adl_end(std::get<Ns>(ts)))...);
763-
}
764-
765-
template <size_t... Ns> iterator end_impl(index_sequence<Ns...>) const {
766-
return iterator(std::make_pair(adl_end(std::get<Ns>(ts)),
767-
adl_end(std::get<Ns>(ts)))...);
768-
}
769-
770-
public:
771-
zip_longest_range(Args &&... ts_) : ts(std::forward<Args>(ts_)...) {}
772-
773-
iterator begin() const { return begin_impl(index_sequence_for<Args...>{}); }
774-
iterator end() const { return end_impl(index_sequence_for<Args...>{}); }
775-
};
776-
} // namespace detail
777-
778-
/// Iterate over two or more iterators at the same time. Iteration continues
779-
/// until all iterators reach the end. The llvm::Optional only contains a value
780-
/// if the iterator has not reached the end.
781-
template <typename T, typename U, typename... Args>
782-
detail::zip_longest_range<T, U, Args...> zip_longest(T &&t, U &&u,
783-
Args &&... args) {
784-
return detail::zip_longest_range<T, U, Args...>(
785-
std::forward<T>(t), std::forward<U>(u), std::forward<Args>(args)...);
786-
}
787-
788664
/// Iterator wrapper that concatenates sequences together.
789665
///
790666
/// This can concatenate different iterators, even with different types, into

llvm/unittests/ADT/IteratorTest.cpp

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -328,36 +328,6 @@ TEST(ZipIteratorTest, ZipFirstBasic) {
328328
EXPECT_EQ(iters, 4u);
329329
}
330330

331-
TEST(ZipIteratorTest, ZipLongestBasic) {
332-
using namespace std;
333-
const vector<unsigned> pi{3, 1, 4, 1, 5, 9};
334-
const vector<StringRef> e{"2", "7", "1", "8"};
335-
336-
{
337-
// Check left range longer than right.
338-
const vector<tuple<Optional<unsigned>, Optional<StringRef>>> expected{
339-
{3, {"2"}}, {1, {"7"}}, {4, {"1"}}, {1, {"8"}}, {5, None}, {9, None}};
340-
size_t iters = 0;
341-
for (auto tup : zip_longest(pi, e)) {
342-
EXPECT_EQ(tup, expected[iters]);
343-
iters += 1;
344-
}
345-
EXPECT_EQ(iters, expected.size());
346-
}
347-
348-
{
349-
// Check right range longer than left.
350-
const vector<tuple<Optional<StringRef>, Optional<unsigned>>> expected{
351-
{{"2"}, 3}, {{"7"}, 1}, {{"1"}, 4}, {{"8"}, 1}, {None, 5}, {None, 9}};
352-
size_t iters = 0;
353-
for (auto tup : zip_longest(e, pi)) {
354-
EXPECT_EQ(tup, expected[iters]);
355-
iters += 1;
356-
}
357-
EXPECT_EQ(iters, expected.size());
358-
}
359-
}
360-
361331
TEST(ZipIteratorTest, Mutability) {
362332
using namespace std;
363333
const SmallVector<unsigned, 4> pi{3, 1, 4, 1, 5, 9};

0 commit comments

Comments
 (0)