1#ifndef NEFORCE_CORE_INTERFACE_IITERATOR_HPP__
2#define NEFORCE_CORE_INTERFACE_IITERATOR_HPP__
12NEFORCE_BEGIN_NAMESPACE__
28template <
typename Iterator>
31 constexpr Iterator& derived()
noexcept {
return static_cast<Iterator&
>(*this); }
33 constexpr const Iterator& derived()
const noexcept {
return static_cast<const Iterator&
>(*this); }
40 NEFORCE_NODISCARD
constexpr decltype(
auto)
operator*() const noexcept {
return derived().dereference(); }
46 NEFORCE_NODISCARD
constexpr decltype(
auto) operator->() const noexcept {
return &(derived().dereference()); }
53 derived().increment();
62 Iterator temp = derived();
63 derived().increment();
72 derived().decrement();
81 Iterator temp = derived();
82 derived().decrement();
91 template <
typename Distance>
102 template <
typename Distance>
103 NEFORCE_NODISCARD
constexpr Iterator
operator+(Distance n)
const noexcept {
104 Iterator temp = derived();
115 template <
typename Distance>
117 return it.derived() + n;
125 template <
typename Distance>
127 derived().advance(-n);
137 template <
typename T>
139 Iterator temp = derived();
149 NEFORCE_NODISCARD
constexpr decltype(
auto)
operator-(
const Iterator& other)
const noexcept {
150 return derived().distance_to(other);
158 NEFORCE_NODISCARD
constexpr bool operator==(
const Iterator& rhs)
const noexcept {
return derived().equal(rhs); }
165 NEFORCE_NODISCARD
constexpr bool operator!=(
const Iterator& rhs)
const noexcept {
return !(*
this == rhs); }
172 NEFORCE_NODISCARD
constexpr bool operator<(
const Iterator& rhs)
const noexcept {
return derived().less_than(rhs); }
179 NEFORCE_NODISCARD
constexpr bool operator>(
const Iterator& rhs)
const noexcept {
return rhs < derived(); }
186 NEFORCE_NODISCARD
constexpr bool operator<=(
const Iterator& rhs)
const noexcept {
return !(derived() > rhs); }
193 NEFORCE_NODISCARD
constexpr bool operator>=(
const Iterator& rhs)
const noexcept {
return !(derived() < rhs); }
198NEFORCE_END_NAMESPACE__
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_NODISCARD constexpr enable_if_t<!is_same_v< T, Iterator >, Iterator > operator-(const T n) const noexcept
减法操作符
constexpr Iterator & operator++() noexcept
前置递增操作符
NEFORCE_NODISCARD constexpr bool operator==(const Iterator &rhs) const noexcept
相等比较操作符
constexpr Iterator & operator-=(Distance n) noexcept
复合减法赋值操作符
NEFORCE_NODISCARD constexpr Iterator operator+(Distance n) const noexcept
加法操作符
constexpr Iterator & operator+=(Distance n) noexcept
复合加法赋值操作符
constexpr Iterator & operator--() noexcept
前置递减操作符
constexpr Iterator operator--(int) noexcept
后置递减操作符
NEFORCE_NODISCARD constexpr bool operator>=(const Iterator &rhs) const noexcept
大于等于比较操作符
NEFORCE_NODISCARD friend constexpr Iterator operator+(Distance n, const iiterator &it) noexcept
友元加法操作符
constexpr Iterator operator++(int) noexcept
后置递增操作符
NEFORCE_NODISCARD constexpr bool operator<=(const Iterator &rhs) const noexcept
小于等于比较操作符
NEFORCE_NODISCARD constexpr bool operator<(const Iterator &rhs) const noexcept
小于比较操作符
NEFORCE_NODISCARD constexpr bool operator!=(const Iterator &rhs) const noexcept
不等比较操作符
NEFORCE_NODISCARD constexpr bool operator>(const Iterator &rhs) const noexcept
大于比较操作符