#include <iostream>
template <typename T>
void DisplayContents (const T& Input)
{
for (auto iElement = Input.cbegin() // no intellisense
; iElement != Input.cend()
; ++ iElement )
std::cout << *iElement << ' ';
std::cout << std::endl;
}
template <typename T>
class Range
{
public:
class iterator {
friend class Range;
private:
explicit iterator(T value);
T value;
public:
T operator*() const;
iterator & operator++();
iterator operator++(int);
bool operator==(iterator const &) const;
bool operator!=(iterator const &) const;
};
public:
Range(T begin, T end);
iterator cbegin() const;
iterator cend() const;
private:
T begin;
T end;
};
template <typename T>
Range<T>::Range(T begin, T end) : begin(begin), end(end) { }
template <typename T>
typename Range<T>::iterator Range<T>::cbegin() const {
return iterator(begin);
}
template <typename T>
typename Range<T>::iterator Range<T>::cend() const {
return iterator(end);
}
template <typename T>
Range<T>::iterator::iterator(T value) : value(value) { }
template <typename T>
typename Range<T>::iterator & Range<T>::iterator::operator++() {
++value;
return *this;
}
template <typename T>
typename Range<T>::iterator Range<T>::iterator::operator++(int) {
auto copy = *this;
++value;
return copy;
}
template <typename T>
bool Range<T>::iterator::operator==(iterator const & other) const {
return other.value == value;
}
template <typename T>
bool Range<T>::iterator::operator!=(iterator const & other) const {
return !this->operator==(other);
}
template <typename T>
T Range<T>::iterator::operator*() const {
return value;
}
int main() {
Range<int> range(0, 5);
DisplayContents(range);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgRGlzcGxheUNvbnRlbnRzIChjb25zdCBUJiBJbnB1dCkKewogICAgZm9yIChhdXRvIGlFbGVtZW50ID0gSW5wdXQuY2JlZ2luKCkgLy8gbm8gaW50ZWxsaXNlbnNlCiAgICA7IGlFbGVtZW50ICE9IElucHV0LmNlbmQoKQogICAgOyArKyBpRWxlbWVudCApCiAgICBzdGQ6OmNvdXQgPDwgKmlFbGVtZW50IDw8ICcgJzsKCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgUmFuZ2UKewpwdWJsaWM6CgljbGFzcyBpdGVyYXRvciB7CgkJZnJpZW5kIGNsYXNzIFJhbmdlOwoJCQoJcHJpdmF0ZToKCQlleHBsaWNpdCBpdGVyYXRvcihUIHZhbHVlKTsKCQkKCQlUIHZhbHVlOwoJCQoJcHVibGljOgoJCVQgb3BlcmF0b3IqKCkgY29uc3Q7CgkJCgkJaXRlcmF0b3IgJiBvcGVyYXRvcisrKCk7CgkJaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOwoJCQoJCWJvb2wgb3BlcmF0b3I9PShpdGVyYXRvciBjb25zdCAmKSBjb25zdDsKCQlib29sIG9wZXJhdG9yIT0oaXRlcmF0b3IgY29uc3QgJikgY29uc3Q7Cgl9OwoJCnB1YmxpYzoKCVJhbmdlKFQgYmVnaW4sIFQgZW5kKTsKCQoJaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Q7CglpdGVyYXRvciBjZW5kKCkgY29uc3Q7CgkKcHJpdmF0ZToKCVQgYmVnaW47CglUIGVuZDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpSYW5nZTxUPjo6UmFuZ2UoVCBiZWdpbiwgVCBlbmQpIDogYmVnaW4oYmVnaW4pLCBlbmQoZW5kKSB7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp0eXBlbmFtZSBSYW5nZTxUPjo6aXRlcmF0b3IgUmFuZ2U8VD46OmNiZWdpbigpIGNvbnN0IHsKCXJldHVybiBpdGVyYXRvcihiZWdpbik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp0eXBlbmFtZSBSYW5nZTxUPjo6aXRlcmF0b3IgUmFuZ2U8VD46OmNlbmQoKSBjb25zdCB7CglyZXR1cm4gaXRlcmF0b3IoZW5kKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClJhbmdlPFQ+OjppdGVyYXRvcjo6aXRlcmF0b3IoVCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkgeyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KdHlwZW5hbWUgUmFuZ2U8VD46Oml0ZXJhdG9yICYgUmFuZ2U8VD46Oml0ZXJhdG9yOjpvcGVyYXRvcisrKCkgewoJKyt2YWx1ZTsKCXJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIFJhbmdlPFQ+OjppdGVyYXRvciBSYW5nZTxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yKysoaW50KSB7CglhdXRvIGNvcHkgPSAqdGhpczsKCSsrdmFsdWU7CglyZXR1cm4gY29weTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmJvb2wgUmFuZ2U8VD46Oml0ZXJhdG9yOjpvcGVyYXRvcj09KGl0ZXJhdG9yIGNvbnN0ICYgb3RoZXIpIGNvbnN0IHsKCXJldHVybiBvdGhlci52YWx1ZSA9PSB2YWx1ZTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmJvb2wgUmFuZ2U8VD46Oml0ZXJhdG9yOjpvcGVyYXRvciE9KGl0ZXJhdG9yIGNvbnN0ICYgb3RoZXIpIGNvbnN0IHsKCXJldHVybiAhdGhpcy0+b3BlcmF0b3I9PShvdGhlcik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpUIFJhbmdlPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewoJcmV0dXJuIHZhbHVlOwp9CgppbnQgbWFpbigpIHsKCVJhbmdlPGludD4gcmFuZ2UoMCwgNSk7CgkKCURpc3BsYXlDb250ZW50cyhyYW5nZSk7CgkKCXJldHVybiAwOwp9