fork download
  1. #include <cmath>
  2. #include <initializer_list>
  3.  
  4. #include <vector>
  5. #include <string>
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. class CycledIndexer{
  10. using Number = int;
  11. public:
  12. CycledIndexer(Number max_val, Number val):
  13. max_value(max_val), value(fixed(val)){}
  14. public:
  15. Number max() const{ return max_value; }
  16. void update_max(Number max){
  17. max_value = max;
  18. value = fixed(value);
  19. }
  20.  
  21. void add(int val){ value = fixed(value + val); }
  22. void sub(int val){ add(-val); }
  23.  
  24. void set(int val){ value = fixed(val); }
  25.  
  26. CycledIndexer operator+(Number num){ return CycledIndexer(max_value, value + num); }
  27. CycledIndexer operator-(Number num){ return CycledIndexer(max_value, value - num); }
  28.  
  29. CycledIndexer &operator=(Number num){
  30. set(num);
  31. return *this;
  32. }
  33.  
  34. CycledIndexer &operator+=(Number num){
  35. add(num);
  36. return *this;
  37. }
  38. CycledIndexer &operator-=(Number num){
  39. sub(num);
  40. return *this;
  41. }
  42.  
  43. CycledIndexer &operator++(){
  44. add(1);
  45. return *this;
  46. }
  47. CycledIndexer &operator--(){
  48. sub(1);
  49. return *this;
  50. }
  51.  
  52. CycledIndexer operator++(int){
  53. auto result = *this;
  54. add(1);
  55. return result;
  56. }
  57. CycledIndexer operator--(int){
  58. auto result = *this;
  59. sub(1);
  60. return result;
  61. }
  62.  
  63. operator Number() const
  64. { return value; }
  65. private:
  66. Number fixed(Number val){
  67. auto mod = val%max_value;
  68. return mod<0 ? max_value + mod : mod;
  69. }
  70. private:
  71. Number max_value, value;
  72. };
  73.  
  74. int main(){
  75. vector<string> strings = { "Ala", "ma", "kota", ",", "a", "kot", "ma", "Ale", "." };
  76. CycledIndexer indexer(strings.size(), 0);
  77.  
  78. auto test = [&](auto desc, auto func){
  79. cout << desc << endl;
  80. indexer = 0;
  81. for(size_t i = 0; i < 20; ++i){
  82. const auto &text = strings.at(func());
  83. cout << text << (text == "."? "\n" : " ");
  84. }
  85. cout << endl;
  86. };
  87.  
  88. test("(indexer++)", [&]{ return indexer++; });
  89. test("(++indexer)", [&]{ return ++indexer; });
  90. test("(indexer--)", [&]{ return indexer--; });
  91. test("(--indexer)", [&]{ return --indexer; });
  92. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
(indexer++)
Ala ma kota , a kot ma Ale .
Ala ma kota , a kot ma Ale .
Ala ma 
(++indexer)
ma kota , a kot ma Ale .
Ala ma kota , a kot ma Ale .
Ala ma kota 
(indexer--)
Ala .
Ale ma kot a , kota ma Ala .
Ale ma kot a , kota ma Ala .

(--indexer)
.
Ale ma kot a , kota ma Ala .
Ale ma kot a , kota ma Ala .
Ale