#include <iostream>
#include <vector>
template <typename Range>
class counted_view {
Range r;
typedef counted_view self;
typedef decltype(std::begin(r)) nested_iterator;
typedef decltype(*std::begin(r)) nested_value_type;
public:
counted_view(Range& r) : r(r) {}
class iterator
{
public:
iterator(nested_iterator iter) : iter(iter), counter(0) {}
std::pair<std::size_t, nested_value_type> operator*()
{
return std::pair<std::size_t, nested_value_type>(counter, *iter);
}
iterator& operator++()
{
++iter;
++counter;
return *this;
}
bool operator!=(iterator& other)
{
return iter != other.iter;
}
private:
nested_iterator iter;
std::size_t counter;
};
iterator begin()
{
return iterator(std::begin(r));
}
iterator end()
{
return iterator(std::end(r));
}
};
template <typename Range>
counted_view<Range> counted(Range& r) {
return counted_view<Range>(r);
}
int main(int argc, const char * argv[])
{
std::vector<double> vec = {10,20,30,40,50,60,70,80,90};
for(auto p : counted(vec))
{
std::cout << p.first << ": " << p.second << std::endl;
}
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgpjbGFzcyBjb3VudGVkX3ZpZXcgewogICAgUmFuZ2UgcjsKCiAgICB0eXBlZGVmIGNvdW50ZWRfdmlldyBzZWxmOwoKICAgIHR5cGVkZWYgZGVjbHR5cGUoc3RkOjpiZWdpbihyKSkgbmVzdGVkX2l0ZXJhdG9yOwogICAgdHlwZWRlZiBkZWNsdHlwZSgqc3RkOjpiZWdpbihyKSkgbmVzdGVkX3ZhbHVlX3R5cGU7CnB1YmxpYzoKCiAgICBjb3VudGVkX3ZpZXcoUmFuZ2UmIHIpIDogcihyKSB7fQoKICAgIGNsYXNzIGl0ZXJhdG9yCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgaXRlcmF0b3IobmVzdGVkX2l0ZXJhdG9yIGl0ZXIpIDogaXRlcihpdGVyKSwgY291bnRlcigwKSB7fQoKICAgICAgICBzdGQ6OnBhaXI8c3RkOjpzaXplX3QsIG5lc3RlZF92YWx1ZV90eXBlPiBvcGVyYXRvciooKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdGQ6OnNpemVfdCwgbmVzdGVkX3ZhbHVlX3R5cGU+KGNvdW50ZXIsICppdGVyKTsKICAgICAgICB9CgogICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkKICAgICAgICB7CiAgICAgICAgICAgICsraXRlcjsKICAgICAgICAgICAgKytjb3VudGVyOwoKICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvciE9KGl0ZXJhdG9yJiBvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpdGVyICE9IG90aGVyLml0ZXI7CiAgICAgICAgfQogICAgICAgIAogICAgcHJpdmF0ZToKICAgICAgICBuZXN0ZWRfaXRlcmF0b3IgaXRlcjsKICAgICAgICBzdGQ6OnNpemVfdCBjb3VudGVyOwogICAgfTsKCiAgICBpdGVyYXRvciBiZWdpbigpCiAgICB7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKHN0ZDo6YmVnaW4ocikpOwogICAgfQoKICAgIGl0ZXJhdG9yIGVuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKHN0ZDo6ZW5kKHIpKTsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KY291bnRlZF92aWV3PFJhbmdlPiBjb3VudGVkKFJhbmdlJiByKSB7CiAgICByZXR1cm4gY291bnRlZF92aWV3PFJhbmdlPihyKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCnsKICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjID0gezEwLDIwLDMwLDQwLDUwLDYwLDcwLDgwLDkwfTsKICAgIGZvcihhdXRvIHAgOiBjb3VudGVkKHZlYykpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHAuZmlyc3QgPDwgIjogIiA8PCBwLnNlY29uZCA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgLy8gaW5zZXJ0IGNvZGUgaGVyZS4uLgogICAgc3RkOjpjb3V0IDw8ICJIZWxsbywgV29ybGQhXG4iOwogICAgcmV0dXJuIDA7Cn0KCg==