arrow_proxy.h 914 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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 value;
  19. };
  20. template <typename Value> struct value_proxy<Value &> {
  21. value_proxy operator=(Value & value) {
  22. this->value = &value;
  23. return *this;
  24. }
  25. operator Value &() const { return *value; }
  26. Value * value;
  27. };
  28. struct ignore_proxy {
  29. template <typename Value> decltype(auto) operator=(Value && value) {
  30. return std::forward<Value>(value);
  31. }
  32. };
  33. }