#pragma GCC system_header #ifndef _LIBCXX_ITERATOR #define _LIBCXX_ITERATOR #include <__config> #include #include _LIBCXX_BEGIN_NAMESPACE_STD struct input_iterator_tag { }; struct output_iterator_tag { }; struct forward_iterator_tag : public input_iterator_tag { }; struct bidirectional_iterator_tag : public forward_iterator_tag { }; struct random_access_iterator_tag : public bidirectional_iterator_tag { }; template struct iterator_traits { using value_type = typename Iter::value_type; using difference_type = typename Iter::difference_type; using pointer = typename Iter::pointer; using reference = typename Iter::reference; using iterator_category = typename Iter::iterator_category; }; template struct iterator_traits { using value_type = T; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; using iterator_category = std::random_access_iterator_tag; }; template class __legacy_iter { }; template class __legacy_iter { public: using value_type = T; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; using iterator_category = std::random_access_iterator_tag; __legacy_iter() = default; __legacy_iter(pointer p) : m_p(p) { } ~__legacy_iter() = default; bool operator!=(const __legacy_iter& other) const { return m_p != other.m_p; } bool operator==(const __legacy_iter& other) const { return m_p == other.m_p; } bool operator<(const __legacy_iter& other) const { return m_p < other.m_p; } bool operator>(const __legacy_iter& other) const { return m_p > other.m_p; } bool operator>=(const __legacy_iter& other) const { return m_p >= other.m_p; } __legacy_iter& operator++() { ++m_p; return *this; } __legacy_iter& operator--() { --m_p; return *this; } __legacy_iter operator++(int) { auto tmp = *this; ++m_p; return tmp; } __legacy_iter operator--(int) { auto tmp = *this; --m_p; return tmp; } __legacy_iter operator-(difference_type value) { return { m_p - value }; } __legacy_iter operator+(difference_type value) { return { m_p + value }; } __legacy_iter& operator+=(difference_type value) { m_p += value; return *this; } __legacy_iter& operator-=(difference_type value) { m_p -= value; return *this; } __legacy_iter& operator=(const __legacy_iter& other) { m_p = other.m_p; return *this; } reference operator*() { return *m_p; } difference_type operator-(const __legacy_iter& other) { return m_p - other.m_p; } constexpr reference operator[](difference_type n) const { return m_p[n]; } private: pointer m_p = nullptr; }; template class reverse_iterator { public: using iterator_type = Iter; using value_type = typename Iter::value_type; using difference_type = typename Iter::difference_type; using pointer = typename Iter::pointer; using reference = typename Iter::reference; using iterator_category = typename Iter::iterator_category; constexpr reverse_iterator() = default; ~reverse_iterator() = default; constexpr explicit reverse_iterator(iterator_type base_iter) : m_base(base_iter) { } constexpr iterator_type base() const { return m_base; } bool operator!=(const reverse_iterator& other) const { return m_base != other.m_base; } bool operator==(const reverse_iterator& other) const { return m_base == other.m_base; } bool operator<(const reverse_iterator& other) const { return m_base < other.m_base; } bool operator>(const reverse_iterator& other) const { return m_base > other.m_base; } bool operator>=(const reverse_iterator& other) const { return m_base >= other.m_base; } reverse_iterator& operator++() { --m_base; return *this; } reverse_iterator& operator--() { ++m_base; return *this; } reverse_iterator operator++(int) { auto tmp = *this; --m_base; return tmp; } reverse_iterator operator--(int) { auto tmp = *this; ++m_base; return tmp; } reverse_iterator operator-(difference_type value) { return { m_base + value }; } reverse_iterator operator+(difference_type value) { return { m_base - value }; } reverse_iterator& operator+=(difference_type value) { m_base -= value; return *this; } reverse_iterator& operator-=(difference_type value) { m_base += value; return *this; } reverse_iterator& operator=(const reverse_iterator& other) { m_base = other.m_base; return *this; } reference operator*() { return *m_base; } difference_type operator-(const reverse_iterator& other) { return other.m_base - m_base; } constexpr reference operator[](difference_type n) const { return m_base[-n]; } private: iterator_type m_base; }; template constexpr typename iterator_traits::difference_type distance(Iter first, Iter last) { typename iterator_traits::difference_type res; while (first != last) { first++; res++; } return res; }; template constexpr void advance(Iter& it, Distance n) { if (n > 0) { while (n--) { it++; } } else if (n < 0) { while (n++) { it--; } } } _LIBCXX_END_NAMESPACE_STD #endif // _LIBCXX_ITERATOR