#include <map>
#include <iostream>
struct pair_wrapper
{
int &first;
float& second;
pair_wrapper* operator->() { return this; }
};
struct thing {
float f[1];
typedef std::pair<int,float> key_data;
struct iterator {
int pos;
float *f;
pair_wrapper operator*() { return pair_wrapper{pos,f[pos]}; }
pair_wrapper operator->() { return pair_wrapper{pos,f[pos]}; }
};
iterator begin() { return {0, f}; }
};
template<typename T> void test(T iter) {
(*iter).second = 1.0; std::cout << (*iter).second;
iter->second = 2.0; std::cout << iter->second;
}
int main() {
std::map<int,float> fmap; fmap[0] = 0.0;
test(fmap.begin());
std::cout << fmap[0];
thing f;
test(f.begin());
std::cout << f.f[0];
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IHBhaXJfd3JhcHBlcgp7CiAgICBpbnQgJmZpcnN0OwogICAgZmxvYXQmIHNlY29uZDsKCiAgICBwYWlyX3dyYXBwZXIqIG9wZXJhdG9yLT4oKSB7IHJldHVybiB0aGlzOyB9Cn07CgpzdHJ1Y3QgdGhpbmcgewogIGZsb2F0IGZbMV07CiAgdHlwZWRlZiBzdGQ6OnBhaXI8aW50LGZsb2F0PiBrZXlfZGF0YTsKCiAgc3RydWN0IGl0ZXJhdG9yIHsKICAgIGludCBwb3M7CiAgICBmbG9hdCAqZjsKICAgIHBhaXJfd3JhcHBlciBvcGVyYXRvciooKSB7IHJldHVybiBwYWlyX3dyYXBwZXJ7cG9zLGZbcG9zXX07IH0KICAgIHBhaXJfd3JhcHBlciBvcGVyYXRvci0+KCkgeyByZXR1cm4gcGFpcl93cmFwcGVye3BvcyxmW3Bvc119OyB9CiAgfTsKCiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB7MCwgZn07IH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdChUIGl0ZXIpIHsKICAoKml0ZXIpLnNlY29uZCA9IDEuMDsgc3RkOjpjb3V0IDw8ICgqaXRlcikuc2Vjb25kOwoKICBpdGVyLT5zZWNvbmQgPSAyLjA7IHN0ZDo6Y291dCA8PCBpdGVyLT5zZWNvbmQ7Cn0KCmludCBtYWluKCkgewogIHN0ZDo6bWFwPGludCxmbG9hdD4gZm1hcDsgZm1hcFswXSA9IDAuMDsKICB0ZXN0KGZtYXAuYmVnaW4oKSk7CiAgc3RkOjpjb3V0IDw8IGZtYXBbMF07CgogIHRoaW5nIGY7CiAgdGVzdChmLmJlZ2luKCkpOwogIHN0ZDo6Y291dCA8PCBmLmZbMF07Cn0K