#include <iterator>
template< typename Iter >
struct Iterator
{
using underlying_iterator = Iter;
private:
mutable underlying_iterator first,
last;
public:
underlying_iterator begin() { return first; }
underlying_iterator end() { return last; }
operator bool() const
{
return first != last;
}
Iterator& operator++()
{
++first;
return *this;
}
Iterator const& operator++() const
{
++first;
return *this;
}
Iterator operator++(int) const
{
Iterator other(*this);
++first;
return other;
}
explicit Iterator( underlying_iterator first,
underlying_iterator last ):
first{first},
last{last} {}
template< typename Container >
Iterator(Container& c) :
Iterator{ std::begin(c), std::end(c) } {}
decltype(*first) operator*()
{
return *first;
}
decltype(*first) operator*() const
{
return *first;
}
};
#include <vector>
#include <iostream>
int main()
{
std::vector<int> const v_const = {43, 38, 129};
Iterator<std::vector<int>::const_iterator> it_const = v_const;
while (it_const)
std::cout << *it_const++ << ' ';
}
I2luY2x1ZGUgPGl0ZXJhdG9yPgoKdGVtcGxhdGU8IHR5cGVuYW1lIEl0ZXIgPgpzdHJ1Y3QgSXRlcmF0b3IKewoJdXNpbmcgdW5kZXJseWluZ19pdGVyYXRvciA9IEl0ZXI7Cgpwcml2YXRlOgoKICAgIG11dGFibGUgdW5kZXJseWluZ19pdGVyYXRvciBmaXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0OwoKcHVibGljOgoKCXVuZGVybHlpbmdfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBmaXJzdDsgfQoJdW5kZXJseWluZ19pdGVyYXRvciBlbmQoKSB7IHJldHVybiBsYXN0OyB9CgogICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIGZpcnN0ICE9IGxhc3Q7CiAgICB9CgogICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKQogICAgewogICAgICAgICsrZmlyc3Q7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIEl0ZXJhdG9yIGNvbnN0JiBvcGVyYXRvcisrKCkgY29uc3QKICAgIHsKICAgICAgICArK2ZpcnN0OwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBJdGVyYXRvciBvcGVyYXRvcisrKGludCkgY29uc3QKICAgIHsKICAgICAgICBJdGVyYXRvciBvdGhlcigqdGhpcyk7CiAgICAgICAgKytmaXJzdDsKICAgICAgICByZXR1cm4gb3RoZXI7CiAgICB9CgogICAgZXhwbGljaXQgSXRlcmF0b3IoIHVuZGVybHlpbmdfaXRlcmF0b3IgZmlyc3QsCgkJCQkJICAgdW5kZXJseWluZ19pdGVyYXRvciBsYXN0ICk6CiAgICAJZmlyc3R7Zmlyc3R9LAogICAgCWxhc3R7bGFzdH0ge30KCgl0ZW1wbGF0ZTwgdHlwZW5hbWUgQ29udGFpbmVyID4KICAgIEl0ZXJhdG9yKENvbnRhaW5lciYgYykgOgogICAgCUl0ZXJhdG9yeyBzdGQ6OmJlZ2luKGMpLCBzdGQ6OmVuZChjKSB9IHt9CgogICAgZGVjbHR5cGUoKmZpcnN0KSBvcGVyYXRvciooKQogICAgewogICAgICAgIHJldHVybiAqZmlyc3Q7CiAgICB9CgogICAgZGVjbHR5cGUoKmZpcnN0KSBvcGVyYXRvciooKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAqZmlyc3Q7CiAgICB9Cn07CgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPGludD4gY29uc3Qgdl9jb25zdCA9IHs0MywgMzgsIDEyOX07CgogICAgSXRlcmF0b3I8c3RkOjp2ZWN0b3I8aW50Pjo6Y29uc3RfaXRlcmF0b3I+IGl0X2NvbnN0ID0gdl9jb25zdDsKCiAgICB3aGlsZSAoaXRfY29uc3QpCiAgICAgICAgc3RkOjpjb3V0IDw8ICppdF9jb25zdCsrIDw8ICcgJzsKfQ==