fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. using namespace std;
  4.  
  5. template <typename T>
  6. class RangeType{
  7. private:
  8. T start, stop, step;
  9. public:
  10. RangeType(T start, T stop, T step):start(start), stop(stop), step(step){ return; }
  11.  
  12. class iterator{
  13. private:
  14. T current, stop, step;
  15. iterator():step(0){ return; }
  16. iterator(T current, T stop, T step):current(current), stop(stop), step(step){ return; }
  17. friend class RangeType;
  18. bool is_alive() const noexcept { return step > 0 ? current < stop : step < 0 ? current > stop : false; }
  19. public:
  20. T operator*() const noexcept{ return current; }
  21. iterator &operator++() noexcept{ current += step; return *this; }
  22.  
  23. template <typename X>
  24. bool operator!=(X &&e) const noexcept { return is_alive(); }
  25. };
  26.  
  27. iterator begin() const noexcept { return iterator(start, stop, step); }
  28. iterator end() const noexcept { return iterator(); }
  29. };
  30.  
  31. template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
  32. inline RangeType<T> range(T stop){ return RangeType<T>(0, stop, 1); }
  33.  
  34. template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
  35. inline RangeType<T> range(T start, T stop, T step = 1){ return RangeType<T>(start, stop, step); }
  36.  
  37. int main(){
  38. for(auto i : range(128)){
  39. cout << i << ' ';
  40. }
  41. cout << endl;
  42. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127