#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;
}
