#include <type_traits>
template<class T> class Range {
class const_iterator {
using I = typename std::conditional<std::is_enum<T>::value,
typename std::underlying_type<T>::type, T>::type;
I i;
public:
const_iterator(const T &i) : i(static_cast<I>(i)) {}
const T operator*() const { return static_cast<T>(i); }
const_iterator &operator++(){ ++i; return *this; }
bool operator!=(const const_iterator &o) const { return i != o.i; }
};
T b, e;
public:
Range(const T &b, const T &e) : b(b), e(e) {}
const_iterator begin() const { return b; }
const_iterator end() const { return e; }
};
enum struct Square : std::size_t {
ZERO, ONE, TWO, THREE, SENTINEL
};
Range<Square> SQ(Square::ZERO, Square::SENTINEL);
#include <iostream>
using namespace std;
int main(){
for(auto s : SQ) cout << static_cast<size_t>(s) << endl;
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgUmFuZ2UgewogICAgY2xhc3MgY29uc3RfaXRlcmF0b3IgewogICAgICAgIHVzaW5nIEkgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsCiAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUsIFQ+Ojp0eXBlOwogICAgICAgIEkgaTsKICAgICAgICBwdWJsaWM6CiAgICAgICAgY29uc3RfaXRlcmF0b3IoY29uc3QgVCAmaSkgOiBpKHN0YXRpY19jYXN0PEk+KGkpKSB7fQogICAgICAgIGNvbnN0IFQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VD4oaSk7IH0KICAgICAgICBjb25zdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpeyArK2k7IHJldHVybiAqdGhpczsgfQogICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciAmbykgY29uc3QgeyByZXR1cm4gaSAhPSBvLmk7IH0KICAgIH07CiAgICBUIGIsIGU7CiAgICBwdWJsaWM6CgogICAgUmFuZ2UoY29uc3QgVCAmYiwgY29uc3QgVCAmZSkgOiBiKGIpLCBlKGUpIHt9CiAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGI7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGU7IH0KfTsKCmVudW0gc3RydWN0IFNxdWFyZSA6IHN0ZDo6c2l6ZV90IHsKICAgIFpFUk8sIE9ORSwgVFdPLCBUSFJFRSwgU0VOVElORUwKfTsKClJhbmdlPFNxdWFyZT4gU1EoU3F1YXJlOjpaRVJPLCBTcXVhcmU6OlNFTlRJTkVMKTsKCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IG1haW4oKXsKICAgIGZvcihhdXRvIHMgOiBTUSkgY291dCA8PCBzdGF0aWNfY2FzdDxzaXplX3Q+KHMpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==