#include <iostream>
template <int limit> class NegativeNumber
{
public:
NegativeNumber() : current(0) {};
int operator()()
{
return -(1 + (current++ % limit));
};
private:
int current;
};
class NegativeNumberNoTemplate
{
public:
NegativeNumberNoTemplate(int limit) : m_limit(limit), current(0) {};
int operator()()
{
return -(1 + (current++ % m_limit));
};
private:
const int m_limit;
int current;
};
void f5(NegativeNumber<5> &n)
{
std::cout << "limit five: " << n() << '\n';
}
void f2(NegativeNumber<2> &n)
{
std::cout << "limit two: " << n() << '\n';
}
void f(NegativeNumberNoTemplate &n)
{
std::cout << "no template: " << n() << '\n';
}
int main(int argc, char **argv)
{
NegativeNumber<5> five;
NegativeNumber<2> two;
NegativeNumberNoTemplate notemplate(3);
for (int x = 0; x < 7; ++x)
{
std::cout << "limit five: " << five() << "\tlimit two: " << two() << '\n';
std::cout << "no template: " << notemplate() << '\n';
}
f5(five);
f2(two);
f(notemplate);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGludCBsaW1pdD4gY2xhc3MgTmVnYXRpdmVOdW1iZXIKewpwdWJsaWM6CiAgICBOZWdhdGl2ZU51bWJlcigpIDogY3VycmVudCgwKSB7fTsKCiAgICBpbnQgb3BlcmF0b3IoKSgpCiAgICB7CiAgICAgICAgcmV0dXJuIC0oMSArIChjdXJyZW50KysgJSBsaW1pdCkpOwogICAgfTsKcHJpdmF0ZToKICAgIGludCBjdXJyZW50Owp9OwoKY2xhc3MgTmVnYXRpdmVOdW1iZXJOb1RlbXBsYXRlCnsKcHVibGljOgogICAgTmVnYXRpdmVOdW1iZXJOb1RlbXBsYXRlKGludCBsaW1pdCkgOiBtX2xpbWl0KGxpbWl0KSwgY3VycmVudCgwKSB7fTsKCiAgICBpbnQgb3BlcmF0b3IoKSgpCiAgICB7CiAgICAgICAgcmV0dXJuIC0oMSArIChjdXJyZW50KysgJSBtX2xpbWl0KSk7CiAgICB9Owpwcml2YXRlOgogICAgY29uc3QgaW50IG1fbGltaXQ7CiAgICBpbnQgY3VycmVudDsKfTsKCnZvaWQgZjUoTmVnYXRpdmVOdW1iZXI8NT4gJm4pCnsKICAgIHN0ZDo6Y291dCA8PCAibGltaXQgZml2ZTogIiA8PCBuKCkgPDwgJ1xuJzsKfQoKdm9pZCBmMihOZWdhdGl2ZU51bWJlcjwyPiAmbikKewogICAgc3RkOjpjb3V0IDw8ICJsaW1pdCB0d286ICIgPDwgbigpIDw8ICdcbic7Cn0KCnZvaWQgZihOZWdhdGl2ZU51bWJlck5vVGVtcGxhdGUgJm4pCnsKICAgIHN0ZDo6Y291dCA8PCAibm8gdGVtcGxhdGU6ICIgPDwgbigpIDw8ICdcbic7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgTmVnYXRpdmVOdW1iZXI8NT4gZml2ZTsKICAgIE5lZ2F0aXZlTnVtYmVyPDI+IHR3bzsKICAgIE5lZ2F0aXZlTnVtYmVyTm9UZW1wbGF0ZSBub3RlbXBsYXRlKDMpOwoKICAgIGZvciAoaW50IHggPSAwOyB4IDwgNzsgKyt4KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAibGltaXQgZml2ZTogIiA8PCBmaXZlKCkgPDwgIlx0bGltaXQgdHdvOiAiIDw8IHR3bygpIDw8ICdcbic7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJubyB0ZW1wbGF0ZTogIiA8PCBub3RlbXBsYXRlKCkgPDwgJ1xuJzsKICAgIH0KCiAgICBmNShmaXZlKTsKICAgIGYyKHR3byk7CiAgICBmKG5vdGVtcGxhdGUpOwoKICAgIHJldHVybiAwOwp9