Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2023
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. template <typename T>
  5. struct iterable;
  6. template <typename T>
  7. struct iterable<T&> {
  8.     using type = T&;
  9. };
  10. template <typename T>
  11. struct iterable<T&&> {
  12.     using type = T;
  13. };
  14. template <typename T, std::size_t N>
  15. struct iterable<T (&&)[N]> {
  16.     using type = typename T::unsupported;
  17. };
  18. template <typename T>
  19. struct iterator_from_iterable {
  20.     using iterable = typename std::remove_reference<T>::type&;
  21.     using type = decltype(std::begin(std::declval<iterable>()));
  22. };
  23. template <typename T>
  24. struct iterable_traits {
  25.     using raw_iterable = T;
  26.     using raw_iterator = typename iterator_from_iterable<raw_iterable>::type;
  27.     using wrapped_iterable = typename iterable<T>::type;
  28.     using deref_value_type = decltype(*std::declval<raw_iterator>());
  29. };
  30.  
  31. template <typename T>
  32. struct Range {
  33.    private:
  34.     const T l, r, skip;
  35.  
  36.    public:
  37.     struct It {
  38.         T i;
  39.         const T skip;
  40.         explicit It(T _i, T _skip) : i(_i), skip(_skip) {}
  41.         It& operator++() { return i += skip, *this; }
  42.         const It& operator++(int) {
  43.             auto temp = *this;
  44.             return operator++(), temp;
  45.         }
  46.         T operator*() const { return i; }
  47.         bool operator!=(const It& it) const { return (skip >= 0) ? (i < *it) : (i > *it); }
  48.         bool operator==(const It& it) const { return (skip >= 0) ? (i >= *it) : (i <= *it); }
  49.     };
  50.     using iterator = It;
  51.     using value_type = T;
  52.     Range(T _l, T _r, T _skip = 1) : l(_l), r(_r), skip(_skip) {
  53. #ifdef DEBUG
  54.         assert(skip != 0);
  55. #endif
  56.     }
  57.     Range(T n) : Range(T(0), n, T(1)) {}
  58.     It begin() const {
  59.         return It(l, skip);
  60.     }
  61.     It end() const {
  62.         return It(r, skip);
  63.     }
  64.     It begin() {
  65.         return It(l, skip);
  66.     }
  67.     It end() {
  68.         return It(r, skip);
  69.     }
  70. };
  71.  
  72. template <typename... T>
  73. struct zip {
  74.    public:
  75.     using value_type = std::tuple<typename iterable_traits<T>::deref_value_type...>;
  76.     using wrapped_iterables = std::tuple<typename iterable_traits<T>::wrapped_iterable...>;
  77.     using raw_iterators = std::tuple<typename iterable_traits<T>::raw_iterator...>;
  78.     using sequence = std::index_sequence_for<T...>;
  79.     struct It {
  80.        public:
  81.         explicit It(raw_iterators iterators) : iterators_(std::move(iterators)) {}
  82.         bool operator==(const It& it) const { return any_eq(it, sequence()); }
  83.         bool operator!=(const It& it) const { return !any_eq(it, sequence()); }
  84.         value_type operator*() const { return deref(sequence()); }
  85.         It& operator++() { return inc(sequence()), *this; }
  86.         const It& operator++(int) {
  87.             auto temp = *this;
  88.             return operator++(), temp;
  89.         }
  90.  
  91.        private:
  92.         raw_iterators iterators_;
  93.         template <std::size_t... I>
  94.         bool any_eq(const It& it, std::index_sequence<I...>) const {
  95.             return (... || (std::get<I>(iterators_) == std::get<I>(it.iterators_)));
  96.         }
  97.         template <std::size_t... I>
  98.         value_type deref(std::index_sequence<I...>) const {
  99.             return {(*std::get<I>(iterators_))...};
  100.         }
  101.         template <std::size_t... I>
  102.         void inc(std::index_sequence<I...>) {
  103.             (++std::get<I>(iterators_), ...);
  104.         }
  105.     };
  106.     using iterator = It;
  107.     explicit zip(T&&... iterables) : iterables_(std::forward<T>(iterables)...) {}
  108.     It begin() { return begin_(sequence()); }
  109.     It end() { return end_(sequence()); }
  110.     It begin() const { return begin_(sequence()); }
  111.     It end() const { return end_(sequence()); }
  112.  
  113.    private:
  114.     wrapped_iterables iterables_;
  115.     template <std::size_t... Int>
  116.     iterator begin_(std::index_sequence<Int...>) {
  117.         return iterator(std::tuple(std::begin(std::get<Int>(iterables_))...));
  118.     }
  119.     template <std::size_t... Int>
  120.     iterator end_(std::index_sequence<Int...>) {
  121.         return iterator(std::tuple(std::end(std::get<Int>(iterables_))...));
  122.     }
  123. };
  124.  
  125. template <typename... T>
  126. zip(T&&...) -> zip<T&&...>;
  127.  
  128. template <typename T>
  129. struct enumerate {
  130.    public:
  131.     using size_type = typename std::make_signed<std::size_t>::type;
  132.     using wrapped_iterable = typename iterable_traits<T>::wrapped_iterable;
  133.     using raw_iterator = typename iterable_traits<T>::raw_iterator;
  134.     using value_type = std::pair<size_type, typename iterable_traits<T>::deref_value_type>;
  135.     struct It {
  136.         raw_iterator iter_;
  137.         size_type start_;
  138.  
  139.        public:
  140.         It(raw_iterator it, size_type start) : iter_(it), start_(start) {}
  141.         bool operator==(const It& it) const { return iter_ == it.iter_; }
  142.         bool operator!=(const It& it) const { return iter_ != it.iter_; }
  143.         It& operator++() { return ++iter_, ++start_, *this; }
  144.         const It operator++(int) {
  145.             auto temp = *this;
  146.             return operator++(), temp;
  147.         }
  148.         value_type operator*() const { return {start_, *iter_}; }
  149.     };
  150.     using iterator = It;
  151.     explicit enumerate(T&& iterable, size_type start = 0) : iterable_(std::forward<T>(iterable)), start_(start) {}
  152.     It begin() { return It(std::begin(iterable_), start_); }
  153.     It end() { return It(std::end(iterable_), 0); }
  154.     It begin() const { return It(std::begin(iterable_), start_); }
  155.     It end() const { return It(std::end(iterable_), 0); }
  156.  
  157.    private:
  158.     wrapped_iterable iterable_;
  159.     size_type start_;
  160. };
  161.  
  162. template <typename T>
  163. enumerate(T&&) -> enumerate<T&&>;
  164. template <typename T, typename Index>
  165. enumerate(T&&, Index) -> enumerate<T&&>;
  166.  
  167.  
  168. int main() {
  169.     vector<int> a = {1, 2, 3};
  170.     vector<double> b = {4, 5, 6};
  171.     for (auto [x, y] : zip(a, b)) {
  172.         cout << x << ' ' << y << '\n';
  173.     }
  174.     for (auto [i, x] : enumerate(a)) {
  175.         cout << i << ' ' << x << '\n';
  176.     }
  177.     return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement