#include <vector>
#include <iostream>
template <typename T>
void foo(T begin, T end)
{
for (; begin != end; ++begin)
{
std::cout << " " << *begin;
}
}
template <typename T>
void foo(T begin, std::reverse_iterator<T> end)
{
foo(begin, end.base());
}
template <typename T>
void foo(std::reverse_iterator<T> begin, T end)
{
foo(end, begin.base());
}
template <typename T>
void foo(std::reverse_iterator<T> begin, std::reverse_iterator<T> end)
{
foo(end.base(), begin.base());
}
int main()
{
std::vector<int> v { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foo(v.begin(), v.end()); std::cout << std::endl;
foo(v.begin(), v.rbegin()); std::cout << std::endl;
foo(v.rbegin(), v.begin()); std::cout << std::endl;
foo(v.rbegin(), v.rend()); std::cout << std::endl;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKFQgYmVnaW4sIFQgZW5kKQp7CiAgZm9yICg7IGJlZ2luICE9IGVuZDsgKytiZWdpbikKICB7CiAgICBzdGQ6OmNvdXQgPDwgIiAiIDw8ICpiZWdpbjsKICB9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGZvbyhUIGJlZ2luLCBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8VD4gZW5kKQp7CiAgZm9vKGJlZ2luLCBlbmQuYmFzZSgpKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgZm9vKHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxUPiBiZWdpbiwgVCBlbmQpCnsKICBmb28oZW5kLCBiZWdpbi5iYXNlKCkpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBmb28oc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPFQ+IGJlZ2luLCBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8VD4gZW5kKQp7CiAgZm9vKGVuZC5iYXNlKCksIGJlZ2luLmJhc2UoKSk7Cn0KCmludCBtYWluKCkKewogIHN0ZDo6dmVjdG9yPGludD4gdiB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfTsKICBmb28odi5iZWdpbigpLCB2LmVuZCgpKTsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICBmb28odi5iZWdpbigpLCB2LnJiZWdpbigpKTsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICBmb28odi5yYmVnaW4oKSwgdi5iZWdpbigpKTsgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICBmb28odi5yYmVnaW4oKSwgdi5yZW5kKCkpOyBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cg==