arrow_proxy.h 997 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /**
  2. * https://quuxplusone.github.io/blog/2019/02/06/arrow-proxy/
  3. */
  4. #pragma once
  5. namespace iterator::detail {
  6. template <typename Reference> struct arrow_proxy {
  7. arrow_proxy(Reference r) : r(std::move(r)) {}
  8. Reference r;
  9. Reference * operator->() { return std::addressof(r); }
  10. };
  11. template <typename R> arrow_proxy(R r) -> arrow_proxy<R>;
  12. template <typename Value> struct value_proxy {
  13. value_proxy operator=(Value && value) {
  14. this->value = std::move(value);
  15. return *this;
  16. }
  17. operator Value &() const { return value; }
  18. Value & get() const { return value; }
  19. Value value;
  20. };
  21. template <typename Value> struct value_proxy<Value &> {
  22. value_proxy operator=(Value & value) {
  23. this->value = &value;
  24. return *this;
  25. }
  26. operator Value &() const { return *value; }
  27. Value & get() const { return *value; }
  28. Value * value;
  29. };
  30. struct ignore_proxy {
  31. template <typename Value> decltype(auto) operator=(Value && value) {
  32. return std::forward<Value>(value);
  33. }
  34. };
  35. }