capture_iterator.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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/forwards.h>
  10. #include <iterator/proxy.h>
  11. #include <iterator/detail/macro.h>
  12. namespace iterator {
  13. template <typename It>
  14. class capture_iterator : public proxy<It, capture_iterator<It>> {
  15. public:
  16. using super_t = proxy<It, capture_iterator<It>>;
  17. using value_type = typename std::iterator_traits<It>::value_type;
  18. using difference_type = typename std::iterator_traits<It>::difference_type;
  19. private:
  20. value_type cache_;
  21. public:
  22. capture_iterator() = default;
  23. capture_iterator(It it) : super_t(it) { cache_ = super_t::dereference(); }
  24. value_type const & dereference() const { return cache_; }
  25. void increment()
  26. requires(forward<super_t>)
  27. {
  28. super_t::increment();
  29. cache_ = super_t::dereference();
  30. }
  31. void decrement()
  32. requires(bidirectional<super_t>)
  33. {
  34. super_t::decrement();
  35. cache_ = super_t::dereference();
  36. }
  37. void advance(difference_type off)
  38. requires(random_access<super_t>)
  39. {
  40. super_t::advance(off);
  41. cache_ = super_t::dereference();
  42. }
  43. };
  44. template <typename It> capture_iterator(It) -> capture_iterator<It>;
  45. }
  46. #include <iterator/detail/undef.h>