in src/h3lib/lib/algos.c [240:267]
void _kRingInternal(H3Index origin, int k, H3Index* out, int* distances,
int maxIdx, int curK) {
if (origin == 0) return;
// Put origin in the output array. out is used as a hash set.
int 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;
out[off] = origin;
distances[off] = curK;
// Base case: reached an index k away from the origin.
if (curK >= k) return;
// Recurse to all neighbors in no particular order.
for (int i = 0; i < 6; i++) {
int rotations = 0;
_kRingInternal(h3NeighborRotations(origin, DIRECTIONS[i], &rotations),
k, out, distances, maxIdx, curK + 1);
}
}