29 ParentCIt parent_it_end;
42 parent_it_end(parent_it_end), parent_it(parent_it), child_it(child_it) {}
45 parent_it_end(parent_it_end), parent_it(parent_it)
47 tt_assume(parent_it_end == parent_it);
52 ParentIt
parent() const noexcept {
return parent_it; }
56 [[nodiscard]]
bool at_end() const noexcept {
return parent_it == parent_it_end; }
58 template<
typename X=std::remove_reference_t<reference>, std::enable_if_t<!std::is_const_v<X>,
int> = 0>
59 [[nodiscard]] value_type &operator*() noexcept {
return *child_it; }
61 [[nodiscard]] value_type
const &operator*() const noexcept {
return *child_it; }
63 template<
typename X=std::remove_reference_t<reference>, std::enable_if_t<!std::is_const_v<X>,
int> = 0>
64 [[nodiscard]] value_type *operator->() noexcept {
return &(*child_it); }
66 [[nodiscard]] value_type
const *operator->() const noexcept {
return &(*child_it); }
68 template<
typename X=std::remove_reference_t<reference>, std::enable_if_t<!std::is_const_v<X>,
int> = 0>
69 [[nodiscard]] value_type &operator[](
size_t i)
noexcept {
return *(*
this + i); }
71 [[nodiscard]] value_type
const &operator[](
size_t i)
const noexcept {
return *(*
this + i); }
73 nested_vector_iterator &operator++() noexcept {
75 if (child_it == parent_it->cend()) {
78 child_it = parent_it->begin();
84 nested_vector_iterator &operator--() noexcept {
85 if (child_it == parent_it->begin()) {
87 child_it = parent_it->end();
93 nested_vector_iterator operator++(
int)
noexcept {
auto tmp = *
this; ++(*this);
return tmp; }
94 nested_vector_iterator operator--(
int)
noexcept {
auto tmp = *
this; --(*this);
return tmp; }
96 nested_vector_iterator &operator+=(difference_type rhs)
noexcept {
98 return (*
this) -= -rhs;
104 if (line_left < rhs) {
107 child_it = parent_it->begin();
121 nested_vector_iterator &operator-=(difference_type rhs)
noexcept {
123 return (*
this) += -rhs;
127 ttlet line_left =
std::distance(parent_it->begin(), child_it) + 1;
129 if (line_left < rhs) {
131 child_it = parent_it->end() - 1;
144 [[nodiscard]]
friend bool operator==(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
145 if (lhs.at_end() && rhs.at_end()) {
147 }
else if (lhs.at_end() || rhs.at_end()) {
150 return (lhs.parent_it == rhs.parent_it) && (lhs.child_it == rhs.child_it);
154 [[nodiscard]]
friend bool operator<(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
155 if (lhs.at_end() && rhs.at_end()) {
157 }
else if (rhs.at_end()) {
159 }
else if (lhs.at_end()) {
161 }
else if (lhs.parent_it == rhs.parent_it) {
162 return lhs.child_it < rhs.child_it;
164 return lhs.parent_it < rhs.parent_it;
168 [[nodiscard]]
friend bool operator!=(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
return !(lhs == rhs); }
169 [[nodiscard]]
friend bool operator>(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
return rhs < lhs; }
170 [[nodiscard]]
friend bool operator<=(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
return !(lhs > rhs); }
171 [[nodiscard]]
friend bool operator>=(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
return !(lhs < rhs); }
173 [[nodiscard]]
friend nested_vector_iterator operator+(nested_vector_iterator lhs, difference_type rhs)
noexcept {
return lhs += rhs; }
174 [[nodiscard]]
friend nested_vector_iterator operator-(nested_vector_iterator lhs, difference_type rhs)
noexcept {
return lhs -= rhs; }
175 [[nodiscard]]
friend nested_vector_iterator operator+(difference_type lhs, nested_vector_iterator rhs)
noexcept {
return rhs += lhs; }
177 [[nodiscard]]
friend difference_type operator-(nested_vector_iterator
const &lhs, nested_vector_iterator
const &rhs)
noexcept {
183 while (lhs_.parent_it < rhs.parent_it) {
186 lhs_.child_it = lhs_.parent_it->begin();