#include <list>
#include <cassert>
template <typename It>
It safe_next(It it, std::size_t steps, It end)
{
while (it!=end && steps--)
it++;
return it;
}
int main()
{
std::list<int> l { 1,2,3,4,5,6,7,8 };
auto it = begin(l);
assert(safe_next(it, 3, end(l)) == std::next(it, 3));
assert(safe_next(it, 30, end(l)) == end(l));
assert(next(it, std::min(30, std::distance(it, end(l)))) == end(l));
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxjYXNzZXJ0PgoKdGVtcGxhdGUgPHR5cGVuYW1lIEl0PgogICBJdCBzYWZlX25leHQoSXQgaXQsIHN0ZDo6c2l6ZV90IHN0ZXBzLCBJdCBlbmQpCnsKICAgIHdoaWxlIChpdCE9ZW5kICYmIHN0ZXBzLS0pCiAgICAgICAgaXQrKzsKCiAgICByZXR1cm4gaXQ7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpsaXN0PGludD4gbCB7IDEsMiwzLDQsNSw2LDcsOCB9OwogICAgYXV0byBpdCA9IGJlZ2luKGwpOwoKICAgIGFzc2VydChzYWZlX25leHQoaXQsIDMsIGVuZChsKSkgPT0gc3RkOjpuZXh0KGl0LCAzKSk7CiAgICBhc3NlcnQoc2FmZV9uZXh0KGl0LCAzMCwgZW5kKGwpKSA9PSBlbmQobCkpOwogICAgYXNzZXJ0KG5leHQoaXQsIHN0ZDo6bWluKDMwLCBzdGQ6OmRpc3RhbmNlKGl0LCBlbmQobCkpKSkgPT0gZW5kKGwpKTsKfQoK