| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- //
- // sentinal_iterator.h
- // iterator
- //
- // Created by Sam Jaffe on 3/30/23.
- // Copyright © 2023 Sam Jaffe. All rights reserved.
- //
- #pragma once
- #include <iterator/detail/traits.h>
- #include <iterator/facade.h>
- #include <iterator/iterator_fwd.hpp>
- namespace iterator {
- template <typename It>
- class sentinal_iterator : public facade<sentinal_iterator<It>> {
- public:
- using sentinal_type = typename It::sentinal_type;
- static constexpr sentinal_type sentinal{};
- public:
- sentinal_iterator() = default;
- sentinal_iterator(It it) : curr_(it) {}
- template <typename C, typename = std::enable_if_t<detail::is_container_v<C>>>
- sentinal_iterator(C && container) : curr_(std::begin(container)) {
- static_assert(std::is_reference_v<C>,
- "Cannot access iterator of a temporary");
- }
- decltype(auto) dereference() const { return *curr_; }
- void increment() { ++curr_; }
- bool at_end() const { return curr_.at_end() || curr_ == It(); }
- bool equal_to(sentinal_iterator const & other) const {
- // TODO: Fix this clause
- return (at_end() && other.at_end()) || curr_ == other.curr_;
- }
- private:
- It curr_;
- };
- template <typename C> sentinal_iterator(C &&) -> sentinal_iterator<iter<C>>;
- template <typename It> sentinal_iterator(It) -> sentinal_iterator<It>;
- }
- MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinal_iterator);
|