in src/h3lib/lib/algos.c [392:432]
H3Error _gridRingInternal(H3Index origin, int k, H3Index *out) {
// Short-circuit on 'identity' ring
if (k == 0) {
out[0] = origin;
return E_SUCCESS;
}
int64_t maxIdx;
H3Error err = H3_EXPORT(maxGridDiskSize)(k, &maxIdx);
if (err) {
return err;
}
H3Index *disk_out = H3_MEMORY(calloc)(maxIdx, sizeof(H3Index));
if (!disk_out) {
return E_MEMORY_ALLOC;
}
int *disk_distances = H3_MEMORY(calloc)(maxIdx, sizeof(int));
if (!disk_distances) {
H3_MEMORY(free)(disk_out);
return E_MEMORY_ALLOC;
}
err = _gridDiskDistancesInternal(origin, k, disk_out, disk_distances,
maxIdx, 0);
if (err) {
H3_MEMORY(free)(disk_out);
H3_MEMORY(free)(disk_distances);
return err;
}
int current_idx = 0;
for (int64_t i = 0; i < maxIdx; ++i) {
if (disk_out[i] != 0 && disk_distances[i] == k) {
out[current_idx++] = disk_out[i];
}
}
H3_MEMORY(free)(disk_out);
H3_MEMORY(free)(disk_distances);
return E_SUCCESS;
}