#include <vector>
#include <iostream>
#include <utility>
template <class TIterator>
struct Range
{
Range(const TIterator &begin, const TIterator &end)
:_begin(begin), _end(end) {}
TIterator begin() { return _begin; }
TIterator end() { return _end; }
private:
TIterator _begin;
TIterator _end;
};
template <class TRange>
auto make_range(TRange r) -> Range<decltype(std::begin(r))>
{
return { std::begin(r), std::end(r) };
}
template <class TRange>
auto make_range2(TRange &r) -> Range<decltype(std::begin(r))>
{
return { std::begin(r), std::end(r) };
}
int main()
{
std::vector<int> vec = {1,2,3,4,5};
auto r = make_range(vec);
for (auto i : r)
{
std::cout << i << std::endl;
}
std::vector<int> vec2 = {1,2,3,4,5};
auto r2 = make_range2(vec2);
for (auto i : r2)
{
std::cout << i << std::endl;
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDxjbGFzcyBUSXRlcmF0b3I+CnN0cnVjdCBSYW5nZQp7CiBSYW5nZShjb25zdCBUSXRlcmF0b3IgJmJlZ2luLCBjb25zdCBUSXRlcmF0b3IgJmVuZCkKICAgICA6X2JlZ2luKGJlZ2luKSwgX2VuZChlbmQpIHt9CgogVEl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX2JlZ2luOyB9CiBUSXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gX2VuZDsgfQoKcHJpdmF0ZToKIFRJdGVyYXRvciBfYmVnaW47CiBUSXRlcmF0b3IgX2VuZDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUUmFuZ2U+CmF1dG8gbWFrZV9yYW5nZShUUmFuZ2UgcikgLT4gUmFuZ2U8ZGVjbHR5cGUoc3RkOjpiZWdpbihyKSk+CnsKICAgIHJldHVybiB7IHN0ZDo6YmVnaW4ociksIHN0ZDo6ZW5kKHIpIH07ICAgCn0KCnRlbXBsYXRlIDxjbGFzcyBUUmFuZ2U+CmF1dG8gbWFrZV9yYW5nZTIoVFJhbmdlICZyKSAtPiBSYW5nZTxkZWNsdHlwZShzdGQ6OmJlZ2luKHIpKT4KewogICAgcmV0dXJuIHsgc3RkOjpiZWdpbihyKSwgc3RkOjplbmQocikgfTsgICAKfQoKCmludCBtYWluKCkKewogICAgc3RkOjp2ZWN0b3I8aW50PiB2ZWMgPSB7MSwyLDMsNCw1fTsKICAgIGF1dG8gciA9IG1ha2VfcmFuZ2UodmVjKTsKICAgIAogICAgZm9yIChhdXRvIGkgOiByKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBpIDw8IHN0ZDo6ZW5kbDsgICAKICAgIH0KICAgIAogICAgc3RkOjp2ZWN0b3I8aW50PiB2ZWMyID0gezEsMiwzLDQsNX07CiAgICBhdXRvIHIyID0gbWFrZV9yYW5nZTIodmVjMik7CiAgICAKICAgIGZvciAoYXV0byBpIDogcjIpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGkgPDwgc3RkOjplbmRsOyAgIAogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQo=