sentinel_iterator.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //
  2. // sentinel_iterator.h
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 3/30/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <iterator/detail/traits.h>
  10. #include <iterator/facade.h>
  11. #include <iterator/iterator_fwd.hpp>
  12. namespace iterator {
  13. template <typename It>
  14. class sentinel_iterator : public facade<sentinel_iterator<It>> {
  15. public:
  16. using sentinel_type = sentinel_iterator;
  17. public:
  18. sentinel_iterator() = default;
  19. sentinel_iterator(It it) : curr_(it) {}
  20. template <typename C, typename = std::enable_if_t<detail::is_container_v<C>>>
  21. sentinel_iterator(C && container) : curr_(std::begin(container)) {
  22. static_assert(std::is_reference_v<C>,
  23. "Cannot access iterator of a temporary");
  24. }
  25. decltype(auto) dereference() const { return *curr_; }
  26. void increment() { ++curr_; }
  27. bool at_end() const { return curr_.at_end() || curr_ == It(); }
  28. bool equal_to(sentinel_iterator const & other) const {
  29. // TODO: Fix this clause
  30. return (at_end() && other.at_end()) || curr_ == other.curr_;
  31. }
  32. private:
  33. It curr_;
  34. };
  35. template <typename C> sentinel_iterator(C &&) -> sentinel_iterator<iter<C>>;
  36. template <typename It> sentinel_iterator(It) -> sentinel_iterator<It>;
  37. }
  38. MAKE_ITERATOR_FACADE_TYPEDEFS_T(::iterator::sentinel_iterator);