| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- //
- // end_aware_iterator.h
- // iterator
- //
- // Created by Sam Jaffe on 2/7/17.
- //
- #pragma once
- #include <iterator/detail/traits.h>
- #include <iterator/forwards.h>
- #include <iterator/proxy.h>
- #include <iterator/sentinel.h>
- #include <iterator/detail/macro.h>
- namespace iterator {
- /**
- * @class end_aware_iterator
- * @brief An iterator that keeps track of the relative end of the range.
- *
- * @tparam It The underlying iterator type
- */
- template <typename It>
- class end_aware_iterator : public proxy<It, end_aware_iterator<It>> {
- public:
- using super_t = proxy<It, end_aware_iterator<It>>;
- using sentinel_type = sentinel_t;
- public:
- end_aware_iterator() = default;
- end_aware_iterator(It it, It end) : super_t(it), end_(end) {}
- template <typename C, REQUIRES(detail::is_container_v<C>)>
- end_aware_iterator(C && container)
- : super_t(std::begin(container)), end_(std::end(container)) {
- static_assert(std::is_reference_v<C>,
- "Cannot access iterator of a temporary");
- }
- template <typename Ot>
- end_aware_iterator(end_aware_iterator<Ot> const & other)
- : super_t(other.impl()), end_(other.end_) {}
- bool at_end() const {
- if constexpr (detail::is_random_access_v<It>) {
- return super_t::impl() >= end_;
- } else {
- return super_t::impl() == end_;
- }
- }
-
- protected:
- It end() const { return end_; }
- private:
- template <typename O> friend class end_aware_iterator;
- It end_;
- };
- template <typename C>
- end_aware_iterator(C &&) -> end_aware_iterator<detail::iter<C>>;
- template <typename It> end_aware_iterator(It, It) -> end_aware_iterator<It>;
- template <typename It>
- end_aware_iterator(end_aware_iterator<It>, end_aware_iterator<It>)
- -> end_aware_iterator<It>;
- }
- MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::end_aware_iterator);
- #include <iterator/detail/undef.h>
|