capture_iterator.h 1.2 KB

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