// Return-value model only: no system call or actual short write occurs here.
// The supplied signed values stay within -1 through 4; requested is 3.
#include <sys/types.h>
#include <cstddef>
#include <iostream>
#include <limits>

bool advance_model(ssize_t returned, std::size_t requested, std::size_t& offset) {
    if (returned <= 0) {
        return false;
    }
    const auto count{static_cast<std::size_t>(returned)};
    if (count > requested || count > std::numeric_limits<std::size_t>::max() - offset) {
        return false;
    }
    offset += count;
    return true;
}

int main() {
    const std::size_t requested{3};
    std::size_t offset{0};
    bool accepted{advance_model(2, requested, offset)};
    std::cout << "requested=3 accepted=" << accepted << " offset=" << offset << '\n';
    accepted = advance_model(-1, requested, offset);
    std::cout << "returned=-1 accepted=" << accepted << " offset=" << offset << '\n';
    accepted = advance_model(0, requested, offset);
    std::cout << "returned=0 accepted=" << accepted << " offset=" << offset << '\n';
    accepted = advance_model(4, requested, offset);
    std::cout << "returned=4 accepted=" << accepted << " offset=" << offset << '\n';
    if (accepted || offset != 2) {
        return 1;
    }
    return 0;
}
