capture_iterator.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //
  2. // capture_iterator.h
  3. // iterator
  4. //
  5. // Created by Sam Jaffe on 4/1/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <iterator/detail/facade_traits.h>
  10. #include <iterator/forwards.h>
  11. #include <iterator/proxy.h>
  12. #include <iterator/detail/macro.h>
  13. namespace iterator {
  14. template <typename It>
  15. class capture_iterator : public proxy<It, capture_iterator<It>> {
  16. public:
  17. using super_t = proxy<It, capture_iterator<It>>;
  18. using value_type = typename std::iterator_traits<It>::value_type;
  19. using difference_type = typename std::iterator_traits<It>::difference_type;
  20. private:
  21. value_type cache_;
  22. public:
  23. capture_iterator() = default;
  24. capture_iterator(It it) : super_t(it) { cache_ = super_t::dereference(); }
  25. value_type const & dereference() const { return cache_; }
  26. SFINAE(detail::has_increment_v<It>) void increment() {
  27. super_t::increment();
  28. cache_ = super_t::dereference();
  29. }
  30. SFINAE(detail::has_decrement_v<It>) void decrement() {
  31. super_t::decrement();
  32. cache_ = super_t::dereference();
  33. }
  34. SFINAE(detail::is_advanceable_iterator_v<It>)
  35. void advance(difference_type off) {
  36. super_t::advance(off);
  37. cache_ = super_t::dereference();
  38. }
  39. };
  40. template <typename It> capture_iterator(It) -> capture_iterator<It>;
  41. }
  42. #include <iterator/detail/undef.h>