H3Error _gridRingInternal()

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;
}