Files

230 lines
5.6 KiB
Plaintext

#pragma GCC system_header
#ifndef _LIBCXX_ITERATOR
#define _LIBCXX_ITERATOR
#include <__config>
#include <stddef.h>
#include <type_traits>
_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 <class Iter>
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 <class T>
struct iterator_traits<T*> {
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 T>
class __legacy_iter {
};
template <class T>
class __legacy_iter<T*> {
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 Iter>
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 <class Iter>
constexpr typename iterator_traits<Iter>::difference_type distance(Iter first, Iter last)
{
typename iterator_traits<Iter>::difference_type res;
while (first != last) {
first++;
res++;
}
return res;
};
template <class Iter, class Distance>
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