in src/h3lib/lib/coordijk.c [367:407]
H3Error _upAp7rChecked(CoordIJK *ijk) {
// Doesn't need to be checked because i, j, and k must all be non-negative
int i = ijk->i - ijk->k;
int j = ijk->j - ijk->k;
// <0 is checked because the input must all be non-negative, but some
// negative inputs are used in unit tests to exercise the below.
if (i >= INT32_MAX_3 || j >= INT32_MAX_3 || i < 0 || j < 0) {
if (ADD_INT32S_OVERFLOWS(i, i)) {
return E_FAILED;
}
int i2 = i + i;
if (ADD_INT32S_OVERFLOWS(j, j)) {
return E_FAILED;
}
int j2 = j + j;
if (ADD_INT32S_OVERFLOWS(j2, j)) {
return E_FAILED;
}
int j3 = j2 + j;
if (ADD_INT32S_OVERFLOWS(i2, j)) {
return E_FAILED;
}
if (SUB_INT32S_OVERFLOWS(j3, i)) {
return E_FAILED;
}
}
ijk->i = (int)lround(((i * 2) + j) * M_ONESEVENTH);
ijk->j = (int)lround(((j * 3) - i) * M_ONESEVENTH);
ijk->k = 0;
// Expected not to be reachable, because max + min or max - min would need
// to overflow.
if (NEVER(_ijkNormalizeCouldOverflow(ijk))) {
return E_FAILED;
}
_ijkNormalize(ijk);
return E_SUCCESS;
}