#include <iostream>
using namespace std;
int wrap_orig(int index, int max) {
if (index < 0)
return max - 1;
else if (index >= max)
return 0;
else
return index;
}
size_t wrap_new(size_t index, size_t max, int delta) {
if (delta >= 0)
{
unsigned absDelta = static_cast<unsigned>(delta);
if (absDelta >= max)
return 0;
else if (index >= max - absDelta)
return 0;
return index + absDelta;
}
size_t absDelta = static_cast<size_t>(-static_cast<ptrdiff_t>(delta));
if (index >= absDelta)
return index - absDelta;
else if (max == 0)
return 0;
return max - 1;
}
int main() {
cout << wrap_orig(10 + -2, 0) << "\n";
cout << wrap_new(10, 0, -2) << "\n";
cout << "\n";
cout << wrap_orig(10 + -2, 2) << "\n";
cout << wrap_new(10, 2, -2) << "\n";
cout << "\n";
cout << wrap_orig(10 + -2, 10) << "\n";
cout << wrap_new(10, 10, -2) << "\n";
cout << "\n";
cout << wrap_orig(10 + -2, 15) << "\n";
cout << wrap_new(10, 15, -2) << "\n";
cout << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IHdyYXBfb3JpZyhpbnQgaW5kZXgsIGludCBtYXgpIHsKCWlmIChpbmRleCA8IDApCiAgICAgICAgcmV0dXJuIG1heCAtIDE7CiAgICBlbHNlIGlmIChpbmRleCA+PSBtYXgpCiAgICAgICAgcmV0dXJuIDA7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIGluZGV4Owp9CgpzaXplX3Qgd3JhcF9uZXcoc2l6ZV90IGluZGV4LCBzaXplX3QgbWF4LCBpbnQgZGVsdGEpIHsKCWlmIChkZWx0YSA+PSAwKQogICAgewogICAgICAgIHVuc2lnbmVkIGFic0RlbHRhID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlbHRhKTsKICAgICAgICBpZiAoYWJzRGVsdGEgPj0gbWF4KQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBlbHNlIGlmIChpbmRleCA+PSBtYXggLSBhYnNEZWx0YSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIGluZGV4ICsgYWJzRGVsdGE7CiAgICB9CiAgICBzaXplX3QgYWJzRGVsdGEgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KC1zdGF0aWNfY2FzdDxwdHJkaWZmX3Q+KGRlbHRhKSk7CiAgICBpZiAoaW5kZXggPj0gYWJzRGVsdGEpCiAgICAgICAgcmV0dXJuIGluZGV4IC0gYWJzRGVsdGE7CiAgICBlbHNlIGlmIChtYXggPT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgIHJldHVybiBtYXggLSAxOwp9CgppbnQgbWFpbigpIHsKCWNvdXQgPDwgd3JhcF9vcmlnKDEwICsgLTIsIDApIDw8ICJcbiI7Cgljb3V0IDw8IHdyYXBfbmV3KDEwLCAwLCAtMikgICA8PCAiXG4iOwoJY291dCA8PCAiXG4iOwoJY291dCA8PCB3cmFwX29yaWcoMTAgKyAtMiwgMikgPDwgIlxuIjsKCWNvdXQgPDwgd3JhcF9uZXcoMTAsIDIsIC0yKSAgIDw8ICJcbiI7Cgljb3V0IDw8ICJcbiI7Cgljb3V0IDw8IHdyYXBfb3JpZygxMCArIC0yLCAxMCkgPDwgIlxuIjsKCWNvdXQgPDwgd3JhcF9uZXcoMTAsIDEwLCAtMikgICA8PCAiXG4iOwoJY291dCA8PCAiXG4iOwoJY291dCA8PCB3cmFwX29yaWcoMTAgKyAtMiwgMTUpIDw8ICJcbiI7Cgljb3V0IDw8IHdyYXBfbmV3KDEwLCAxNSwgLTIpICAgPDwgIlxuIjsKCWNvdXQgPDwgIlxuIjsKCXJldHVybiAwOwp9