// // sentinal_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 sentinal_iterator : public facade> { public: static inline const sentinal_iterator sentinal{}; public: sentinal_iterator() = default; sentinal_iterator(It it) : curr_(it) {} template >> sentinal_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(sentinal_iterator const & other) const { // TODO: Fix this clause return (at_end() && other.at_end()) || curr_ == other.curr_; } private: It curr_; }; template sentinal_iterator(C &&) -> sentinal_iterator>; template sentinal_iterator(It) -> sentinal_iterator; } MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinal_iterator);