in src/h3lib/lib/algos.c [272:311]
H3Error _gridDiskDistancesInternal(H3Index origin, int k, H3Index *out,
int *distances, int64_t maxIdx, int curK) {
// Put origin in the output array. out is used as a hash set.
int64_t off = origin % maxIdx;
while (out[off] != 0 && out[off] != origin) {
off = (off + 1) % maxIdx;
}
// We either got a free slot in the hash set or hit a duplicate
// We might need to process the duplicate anyways because we got
// here on a longer path before.
if (out[off] == origin && distances[off] <= curK) return E_SUCCESS;
out[off] = origin;
distances[off] = curK;
// Base case: reached an index k away from the origin.
if (curK >= k) return E_SUCCESS;
// Recurse to all neighbors in no particular order.
for (int i = 0; i < 6; i++) {
int rotations = 0;
H3Index nextNeighbor;
H3Error neighborResult = h3NeighborRotations(origin, DIRECTIONS[i],
&rotations, &nextNeighbor);
if (neighborResult != E_PENTAGON) {
// E_PENTAGON is an expected case when trying to traverse off of
// pentagons.
if (neighborResult != E_SUCCESS) {
return neighborResult;
}
neighborResult = _gridDiskDistancesInternal(
nextNeighbor, k, out, distances, maxIdx, curK + 1);
if (neighborResult) {
return neighborResult;
}
}
}
return E_SUCCESS;
}