1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
#ifndef INCLUDED_ITERATOR_H_
#define INCLUDED_ITERATOR_H_
//HEAD
#include <iterator>
#include <compare>
template <typename Class, typename BaseIterator, typename Type>
struct RandomPtrIterator;
#define PtrIterator RandomPtrIterator<Class, BaseIterator, Type>
#define PtrIteratorValue RandomPtrIterator<Class, BaseIterator, value_type>
template <typename Class, typename BaseIterator, typename Type>
bool operator==(PtrIterator const &lhs, PtrIterator const &rhs);
template <typename Class, typename BaseIterator, typename Type>
auto operator<=>(PtrIterator const &lhs, PtrIterator const &rhs);
template <typename Class, typename BaseIterator, typename Type>
int operator-(PtrIterator const &lhs, PtrIterator const &rhs);
template <typename Class, typename BaseIterator, typename Type>
struct RandomPtrIterator
{
using iterator_category = std::random_access_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = Type;
using pointer = value_type *;
using reference = value_type &;
friend PtrIterator Class::begin();
friend PtrIterator Class::end();
friend bool operator==<>(RandomPtrIterator const &lhs,
RandomPtrIterator const &rhs);
friend auto operator<=><>(RandomPtrIterator const &lhs,
RandomPtrIterator const &rhs);
friend int operator-<>(RandomPtrIterator const &lhs,
RandomPtrIterator const &rhs);
private:
BaseIterator d_current;
public:
int operator-(RandomPtrIterator const &rhs) const;
RandomPtrIterator operator+(int step) const;
value_type &operator*() const;
RandomPtrIterator &operator--();
RandomPtrIterator operator--(int);
RandomPtrIterator &operator++();
RandomPtrIterator operator++(int);
RandomPtrIterator operator-(int step) const;
RandomPtrIterator &operator-=(int step);
RandomPtrIterator &operator+=(int step);
value_type *operator->() const;
private:
RandomPtrIterator(BaseIterator const ¤t);
};
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue::RandomPtrIterator(BaseIterator const ¤t)
:
d_current(current)
{}
//=
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue PtrIteratorValue::operator+(int step) const
{
return RandomPtrIterator(d_current + step);
}
//OP*
template <typename Class, typename BaseIterator, typename value_type>
value_type &PtrIteratorValue::operator*() const
{
return **d_current;
}
//=
//CMP
template <typename Class, typename BaseIterator, typename Type>
inline auto operator<=>(PtrIterator const &lhs, PtrIterator const &rhs)
{
return **lhs.d_current <=> **rhs.d_current;
}
//=
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue &PtrIteratorValue::operator--()
{
--d_current;
return *this;
}
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue PtrIteratorValue::operator--(int)
{
return RandomPtrIterator(d_current--);
}
//INC
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue &PtrIteratorValue::operator++()
{
++d_current;
return *this;
}
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue PtrIteratorValue::operator++(int)
{
return RandomPtrIterator(d_current++);
}
//=
template <typename Class, typename BaseIterator, typename Type>
inline bool operator==(PtrIterator const &lhs, PtrIterator const &rhs)
{
return lhs.d_current == rhs.d_current;
}
template <typename Class, typename BaseIterator, typename Type>
int operator-(PtrIterator const &lhs, PtrIterator const &rhs)
{
return lhs.d_current - rhs.d_current;
}
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue &PtrIteratorValue::operator-=(int step)
{
d_current -= step;
return *this;
}
template <typename Class, typename BaseIterator, typename value_type>
PtrIteratorValue &PtrIteratorValue::operator+=(int step)
{
d_current += step;
return *this;
}
template <typename Class, typename BaseIterator, typename value_type>
value_type *PtrIteratorValue::operator->() const
{
return *d_current;
}
#undef PtrIteratorValue
#undef PtrIterator
#endif
|