| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- /**
- * https://quuxplusone.github.io/blog/2019/02/06/arrow-proxy/
- */
- #pragma once
- namespace iterator::detail {
- template <typename Reference> struct arrow_proxy {
- arrow_proxy(Reference r) : r(std::move(r)) {}
- Reference r;
- Reference * operator->() { return std::addressof(r); }
- };
- template <typename R> arrow_proxy(R r) -> arrow_proxy<R>;
- template <typename Value> struct value_proxy {
- value_proxy operator=(Value && value) {
- this->value = std::move(value);
- return *this;
- }
- operator Value &() const { return value; }
- Value & get() const { return value; }
- Value value;
- };
- template <typename Value> struct value_proxy<Value &> {
- value_proxy operator=(Value & value) {
- this->value = &value;
- return *this;
- }
- operator Value &() const { return *value; }
- Value & get() const { return *value; }
- Value * value;
- };
- struct ignore_proxy {
- template <typename Value> decltype(auto) operator=(Value && value) {
- return std::forward<Value>(value);
- }
- };
- }
|