#include <iostream>
//normaly this is MIT Lisence for any use.
//ja.wikipedia.org/wiki/MIT_License
//OR
//if you read japanese text.i agree to NYSL Version 0.9982
//www.kmonos.net/nysl/
template<class T>
class Number_Range{
T B = 0;
T E = 0;
T S = 1;
public:
struct Number_Range_Iterator {
T N = 0;
T S = 1;
Number_Range_Iterator() = delete;
Number_Range_Iterator(const T& Number,const T& Step = 1) :N(Number),S(Step) {}
operator T& () {
return N;
}
T& operator *() {
return N;
}
T& operator ++() {
N += S;
return N;
}
bool operator != (const T& rhs) {
return S > 0 ? (N < rhs):(N > rhs);
}
};
Number_Range() = delete;
Number_Range(const T& Begin, const T& End, const T& Step = 1) :B(Begin), E(End), S(Step) {}
Number_Range(const T& End) :B(0), E(End), S(End>0?1:-1) {}
Number_Range_Iterator begin() {
return Number_Range_Iterator(B,S);
}
Number_Range_Iterator end(){
return Number_Range_Iterator(E,S);
}
};
int main() {
for (auto&o : Number_Range<int>(0, 10)) {
std::cout << o << ' ';
} std::cout << std::endl;
for (auto&o : Number_Range<int>(10)) {
std::cout << o << ' ';
}
std::cout << std::endl;
for (auto&o : Number_Range<int>(100,110,2)) {
std::cout << o << ' ';
}
std::cout << std::endl;
for (auto&o : Number_Range<int>(100,110,3)) {
std::cout << o << ' ';
}
std::cout << std::endl;
for (auto&o : Number_Range<int>(-10)) {
std::cout << o << ' ';
}
std::cout << std::endl;
for (auto&o : Number_Range<int>(0,-10,-3)) {
std::cout << o << ' ';
}
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy9ub3JtYWx5IHRoaXMgaXMgTUlUIExpc2VuY2UgZm9yIGFueSB1c2UuCi8vamEud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlCgovL09SCgovL2lmIHlvdSByZWFkIGphcGFuZXNlIHRleHQuaSBhZ3JlZSB0byBOWVNMIFZlcnNpb24gMC45OTgyCi8vd3d3Lmttb25vcy5uZXQvbnlzbC8KCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIE51bWJlcl9SYW5nZXsKCVQgQiA9IDA7CglUIEUgPSAwOwoJVCBTID0gMTsKCnB1YmxpYzoKCXN0cnVjdCBOdW1iZXJfUmFuZ2VfSXRlcmF0b3IgewoJCVQgTiA9IDA7CgkJVCBTID0gMTsKCQlOdW1iZXJfUmFuZ2VfSXRlcmF0b3IoKSA9IGRlbGV0ZTsKCQlOdW1iZXJfUmFuZ2VfSXRlcmF0b3IoY29uc3QgVCYgTnVtYmVyLGNvbnN0IFQmIFN0ZXAgPSAxKSA6TihOdW1iZXIpLFMoU3RlcCkge30KCgkJb3BlcmF0b3IgVCYgKCkgewoJCQlyZXR1cm4gTjsKCQl9CgkJVCYgb3BlcmF0b3IgKigpIHsKCQkJcmV0dXJuIE47CgkJfQoJCVQmIG9wZXJhdG9yICsrKCkgewoJCQlOICs9IFM7CgkJCXJldHVybiBOOwoJCX0KCQlib29sIG9wZXJhdG9yICE9IChjb25zdCBUJiByaHMpIHsKCQkJcmV0dXJuIFMgPiAwID8gKE4gPCByaHMpOihOID4gcmhzKTsKCQl9Cgl9OwoJTnVtYmVyX1JhbmdlKCkgPSBkZWxldGU7CglOdW1iZXJfUmFuZ2UoY29uc3QgVCYgQmVnaW4sIGNvbnN0IFQmIEVuZCwgY29uc3QgVCYgU3RlcCA9IDEpIDpCKEJlZ2luKSwgRShFbmQpLCBTKFN0ZXApIHt9CglOdW1iZXJfUmFuZ2UoY29uc3QgVCYgRW5kKSA6QigwKSwgRShFbmQpLCBTKEVuZD4wPzE6LTEpIHt9CglOdW1iZXJfUmFuZ2VfSXRlcmF0b3IgYmVnaW4oKSB7CgkJcmV0dXJuIE51bWJlcl9SYW5nZV9JdGVyYXRvcihCLFMpOwoJfQoJTnVtYmVyX1JhbmdlX0l0ZXJhdG9yIGVuZCgpewoJCXJldHVybiBOdW1iZXJfUmFuZ2VfSXRlcmF0b3IoRSxTKTsKCX0KCgp9OwoKaW50IG1haW4oKSB7Cglmb3IgKGF1dG8mbyA6IE51bWJlcl9SYW5nZTxpbnQ+KDAsIDEwKSkgewoJCXN0ZDo6Y291dCA8PCBvIDw8ICcgJzsKCX0Jc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCglmb3IgKGF1dG8mbyA6IE51bWJlcl9SYW5nZTxpbnQ+KDEwKSkgewoJCXN0ZDo6Y291dCA8PCBvIDw8ICcgJzsKCX0KCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cglmb3IgKGF1dG8mbyA6IE51bWJlcl9SYW5nZTxpbnQ+KDEwMCwxMTAsMikpIHsKCQlzdGQ6OmNvdXQgPDwgbyA8PCAnICc7Cgl9CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJZm9yIChhdXRvJm8gOiBOdW1iZXJfUmFuZ2U8aW50PigxMDAsMTEwLDMpKSB7CgkJc3RkOjpjb3V0IDw8IG8gPDwgJyAnOwoJfQoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCWZvciAoYXV0byZvIDogTnVtYmVyX1JhbmdlPGludD4oLTEwKSkgewoJCXN0ZDo6Y291dCA8PCBvIDw8ICcgJzsKCX0KCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cglmb3IgKGF1dG8mbyA6IE51bWJlcl9SYW5nZTxpbnQ+KDAsLTEwLC0zKSkgewoJCXN0ZDo6Y291dCA8PCBvIDw8ICcgJzsKCX0KCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQo=