// // sentinel_iterator.h // iterator // // Created by Sam Jaffe on 3/30/23. // Copyright © 2023 Sam Jaffe. All rights reserved. // #pragma once #include #include #include namespace iterator { template class sentinel_iterator : public facade> { public: using sentinel_type = sentinel_iterator; public: sentinel_iterator() = default; sentinel_iterator(It it) : curr_(it) {} template >> sentinel_iterator(C && container) : curr_(std::begin(container)) { static_assert(std::is_reference_v, "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(sentinel_iterator const & other) const { // TODO: Fix this clause return (at_end() && other.at_end()) || curr_ == other.curr_; } private: It curr_; }; template sentinel_iterator(C &&) -> sentinel_iterator>; template sentinel_iterator(It) -> sentinel_iterator; } MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinel_iterator);