| 148 | explicit operator bool() const { return ptr_ != NULLPTR; } |
| 149 | |
| 150 | class RangeIterator { |
| 151 | public: |
| 152 | RangeIterator() : value_(IterationTraits<T>::End()) {} |
| 153 | |
| 154 | explicit RangeIterator(Iterator i) |
| 155 | : value_(IterationTraits<T>::End()), |
| 156 | iterator_(std::make_shared<Iterator>(std::move(i))) { |
| 157 | Next(); |
| 158 | } |
| 159 | |
| 160 | bool operator!=(const RangeIterator& other) const { return value_ != other.value_; } |
| 161 | |
| 162 | RangeIterator& operator++() { |
| 163 | Next(); |
| 164 | return *this; |
| 165 | } |
| 166 | |
| 167 | Result<T> operator*() { |
| 168 | ARROW_RETURN_NOT_OK(value_); |
| 169 | |
| 170 | auto value = std::move(value_); |
| 171 | value_ = IterationTraits<T>::End(); |
| 172 | return value; |
| 173 | } |
| 174 | |
| 175 | private: |
| 176 | void Next() { |
| 177 | if (!value_.ok()) { |
| 178 | value_ = IterationTraits<T>::End(); |
| 179 | return; |
| 180 | } |
| 181 | value_ = iterator_->Next(); |
| 182 | } |
| 183 | |
| 184 | Result<T> value_; |
| 185 | std::shared_ptr<Iterator> iterator_; |
| 186 | }; |
| 187 | |
| 188 | RangeIterator begin() { return RangeIterator(std::move(*this)); } |
| 189 | |