#include <cmath>
#include <initializer_list>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
class CycledIndexer{
using Number = int ;
public :
CycledIndexer( Number max_val, Number val) :
max_value( max_val) , value( fixed( val) ) { }
public :
Number max( ) const { return max_value; }
void update_max( Number max) {
max_value = max;
value = fixed( value) ;
}
void add( int val) { value = fixed( value + val) ; }
void sub( int val) { add( - val) ; }
void set( int val) { value = fixed( val) ; }
CycledIndexer operator+ ( Number num) { return CycledIndexer( max_value, value + num) ; }
CycledIndexer operator- ( Number num) { return CycledIndexer( max_value, value - num) ; }
CycledIndexer & operator= ( Number num) {
set( num) ;
return * this ;
}
CycledIndexer & operator+ = ( Number num) {
add( num) ;
return * this ;
}
CycledIndexer & operator- = ( Number num) {
sub( num) ;
return * this ;
}
CycledIndexer & operator++ ( ) {
add( 1 ) ;
return * this ;
}
CycledIndexer & operator-- ( ) {
sub( 1 ) ;
return * this ;
}
CycledIndexer operator++ ( int ) {
auto result = * this ;
add( 1 ) ;
return result;
}
CycledIndexer operator-- ( int ) {
auto result = * this ;
sub( 1 ) ;
return result;
}
operator Number( ) const
{ return value; }
private :
Number fixed( Number val) {
auto mod = val% max_value;
return mod< 0 ? max_value + mod : mod;
}
private :
Number max_value, value;
} ;
int main( ) {
vector< string> strings = { "Ala" , "ma" , "kota" , "," , "a" , "kot" , "ma" , "Ale" , "." } ;
CycledIndexer indexer( strings.size ( ) , 0 ) ;
auto test = [ & ] ( auto desc, auto func) {
cout << desc << endl;
indexer = 0 ;
for ( size_t i = 0 ; i < 20 ; ++ i) {
const auto & text = strings.at ( func( ) ) ;
cout << text << ( text == "." ? "\n " : " " ) ;
}
cout << endl;
} ;
test( "(indexer++)" , [ & ] { return indexer++ ; } ) ;
test( "(++indexer)" , [ & ] { return ++ indexer; } ) ;
test( "(indexer--)" , [ & ] { return indexer-- ; } ) ;
test( "(--indexer)" , [ & ] { return -- indexer; } ) ;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEN5Y2xlZEluZGV4ZXJ7CiAgICB1c2luZyBOdW1iZXIgPSBpbnQ7CnB1YmxpYzoKICAgIEN5Y2xlZEluZGV4ZXIoTnVtYmVyIG1heF92YWwsIE51bWJlciB2YWwpOgogICAgICAgIG1heF92YWx1ZShtYXhfdmFsKSwgdmFsdWUoZml4ZWQodmFsKSl7fQpwdWJsaWM6CiAgICBOdW1iZXIgbWF4KCkgY29uc3R7IHJldHVybiBtYXhfdmFsdWU7IH0KICAgIHZvaWQgdXBkYXRlX21heChOdW1iZXIgbWF4KXsKICAgICAgICBtYXhfdmFsdWUgPSBtYXg7CiAgICAgICAgdmFsdWUgPSBmaXhlZCh2YWx1ZSk7CiAgICB9CgogICAgdm9pZCBhZGQoaW50IHZhbCl7IHZhbHVlID0gZml4ZWQodmFsdWUgKyB2YWwpOyB9CiAgICB2b2lkIHN1YihpbnQgdmFsKXsgYWRkKC12YWwpOyB9CgogICAgdm9pZCBzZXQoaW50IHZhbCl7IHZhbHVlID0gZml4ZWQodmFsKTsgfQoKICAgIEN5Y2xlZEluZGV4ZXIgb3BlcmF0b3IrKE51bWJlciBudW0peyByZXR1cm4gQ3ljbGVkSW5kZXhlcihtYXhfdmFsdWUsIHZhbHVlICsgbnVtKTsgfQogICAgQ3ljbGVkSW5kZXhlciBvcGVyYXRvci0oTnVtYmVyIG51bSl7IHJldHVybiBDeWNsZWRJbmRleGVyKG1heF92YWx1ZSwgdmFsdWUgLSBudW0pOyB9CgogICAgQ3ljbGVkSW5kZXhlciAmb3BlcmF0b3I9KE51bWJlciBudW0pewogICAgICAgIHNldChudW0pOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBDeWNsZWRJbmRleGVyICZvcGVyYXRvcis9KE51bWJlciBudW0pewogICAgICAgIGFkZChudW0pOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIEN5Y2xlZEluZGV4ZXIgJm9wZXJhdG9yLT0oTnVtYmVyIG51bSl7CiAgICAgICAgc3ViKG51bSk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIEN5Y2xlZEluZGV4ZXIgJm9wZXJhdG9yKysoKXsKICAgICAgICBhZGQoMSk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgQ3ljbGVkSW5kZXhlciAmb3BlcmF0b3ItLSgpewogICAgICAgIHN1YigxKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgQ3ljbGVkSW5kZXhlciBvcGVyYXRvcisrKGludCl7CiAgICAgICAgYXV0byByZXN1bHQgPSAqdGhpczsKICAgICAgICBhZGQoMSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIEN5Y2xlZEluZGV4ZXIgb3BlcmF0b3ItLShpbnQpewogICAgICAgIGF1dG8gcmVzdWx0ID0gKnRoaXM7CiAgICAgICAgc3ViKDEpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgb3BlcmF0b3IgTnVtYmVyKCkgY29uc3QKICAgIHsgcmV0dXJuIHZhbHVlOyB9CnByaXZhdGU6CiAgICBOdW1iZXIgZml4ZWQoTnVtYmVyIHZhbCl7CiAgICAgICAgYXV0byBtb2QgPSB2YWwlbWF4X3ZhbHVlOwogICAgICAgIHJldHVybiBtb2Q8MCA/IG1heF92YWx1ZSArIG1vZCA6IG1vZDsKICAgIH0KcHJpdmF0ZToKICAgIE51bWJlciBtYXhfdmFsdWUsIHZhbHVlOwp9OwoKaW50IG1haW4oKXsKCXZlY3RvcjxzdHJpbmc+IHN0cmluZ3MgPSB7ICJBbGEiLCAibWEiLCAia290YSIsICIsIiwgImEiLCAia290IiwgIm1hIiwgIkFsZSIsICIuIiB9OwoJQ3ljbGVkSW5kZXhlciBpbmRleGVyKHN0cmluZ3Muc2l6ZSgpLCAwKTsKCQoJYXV0byB0ZXN0ID0gWyZdKGF1dG8gZGVzYywgYXV0byBmdW5jKXsKCQljb3V0IDw8IGRlc2MgPDwgZW5kbDsKCQlpbmRleGVyID0gMDsKCQlmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgMjA7ICsraSl7CgkJCWNvbnN0IGF1dG8gJnRleHQgPSBzdHJpbmdzLmF0KGZ1bmMoKSk7CgkJCWNvdXQgPDwgdGV4dCA8PCAodGV4dCA9PSAiLiI/ICJcbiIgOiAiICIpOwoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9OwoJCgl0ZXN0KCIoaW5kZXhlcisrKSIsIFsmXXsgcmV0dXJuIGluZGV4ZXIrKzsgfSk7Cgl0ZXN0KCIoKytpbmRleGVyKSIsIFsmXXsgcmV0dXJuICsraW5kZXhlcjsgfSk7Cgl0ZXN0KCIoaW5kZXhlci0tKSIsIFsmXXsgcmV0dXJuIGluZGV4ZXItLTsgfSk7Cgl0ZXN0KCIoLS1pbmRleGVyKSIsIFsmXXsgcmV0dXJuIC0taW5kZXhlcjsgfSk7Cn0=
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