@@ -508,11 +508,9 @@ make_early_inc_range(RangeT &&Range) {
508
508
EarlyIncIteratorT (std::end (std::forward<RangeT>(Range))));
509
509
}
510
510
511
- // forward declarations required by zip_shortest/zip_first/zip_longest
511
+ // forward declarations required by zip_shortest/zip_first
512
512
template <typename R, typename UnaryPredicate>
513
513
bool all_of (R &&range, UnaryPredicate P);
514
- template <typename R, typename UnaryPredicate>
515
- bool any_of (R &&range, UnaryPredicate P);
516
514
517
515
template <size_t ... I> struct index_sequence ;
518
516
@@ -663,128 +661,6 @@ detail::zippy<detail::zip_first, T, U, Args...> zip_first(T &&t, U &&u,
663
661
std::forward<T>(t), std::forward<U>(u), std::forward<Args>(args)...);
664
662
}
665
663
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
-
788
664
// / Iterator wrapper that concatenates sequences together.
789
665
// /
790
666
// / This can concatenate different iterators, even with different types, into
0 commit comments