18#include "pw_containers/iterator.h"
20namespace pw::containers {
25template <
typename Iterator,
typename Container>
28 using value_type =
typename Container::value_type;
29 using difference_type = std::ptrdiff_t;
31 typename std::conditional_t<std::is_const_v<Container>,
32 typename Container::const_reference,
33 typename Container::reference>;
34 using pointer =
typename std::conditional_t<std::is_const_v<Container>,
35 typename Container::const_pointer,
36 typename Container::pointer>;
37 using iterator_category = containers::contiguous_iterator_tag;
39 constexpr reference operator*()
const {
return *ptr_; }
40 constexpr pointer operator->()
const {
return ptr_; }
42 constexpr Iterator& operator++() {
44 return static_cast<Iterator&
>(*this);
47 constexpr Iterator& operator--() {
49 return static_cast<Iterator&
>(*this);
52 constexpr Iterator operator++(
int) {
53 Iterator original(ptr_);
58 constexpr Iterator operator--(
int) {
59 Iterator original{ptr_};
64 constexpr Iterator& operator+=(difference_type n) {
66 return static_cast<Iterator&
>(*this);
69 constexpr Iterator& operator-=(difference_type n) {
71 return static_cast<Iterator&
>(*this);
74 friend constexpr Iterator operator+(Iterator it, difference_type n) {
78 friend constexpr Iterator operator+(difference_type n, Iterator it) {
82 friend constexpr Iterator operator-(Iterator it, difference_type n) {
86 friend constexpr difference_type operator-(Iterator lhs, Iterator rhs) {
87 return lhs.ptr_ - rhs.ptr_;
90 friend constexpr bool operator==(Iterator lhs, Iterator rhs) {
91 return lhs.ptr_ == rhs.ptr_;
93 friend constexpr bool operator!=(Iterator lhs, Iterator rhs) {
94 return lhs.ptr_ != rhs.ptr_;
96 friend constexpr bool operator<(Iterator lhs, Iterator rhs) {
97 return lhs.ptr_ < rhs.ptr_;
99 friend constexpr bool operator<=(Iterator lhs, Iterator rhs) {
100 return lhs.ptr_ <= rhs.ptr_;
102 friend constexpr bool operator>(Iterator lhs, Iterator rhs) {
103 return lhs.ptr_ > rhs.ptr_;
105 friend constexpr bool operator>=(Iterator lhs, Iterator rhs) {
106 return lhs.ptr_ >= rhs.ptr_;
109 constexpr reference operator[](difference_type n)
const {
return ptr_[n]; }
114 constexpr explicit PtrIterator(pointer ptr) : ptr_(ptr) {}
117 constexpr Iterator Add(difference_type n)
const {
return Iterator(ptr_ + n); }
135template <
typename Container>
147 explicit constexpr PtrIterator(
typename Base::pointer ptr) :
Base(ptr) {}
156template <
typename Container>
165 :
Base(other.operator->()) {}
Definition: ptr_iterator.h:159
Definition: ptr_iterator.h:137
Definition: ptr_iterator.h:26