gossmap: add functions to map index back to node/chan.

Useful if you want to store per-chan or per-node side-data in an array.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2022-09-18 09:52:50 +09:30
parent 6a48ed9e82
commit 016e332304
2 changed files with 20 additions and 0 deletions

View File

@@ -176,6 +176,23 @@ u32 gossmap_chan_idx(const struct gossmap *map, const struct gossmap_chan *chan)
return chan - map->chan_arr; return chan - map->chan_arr;
} }
struct gossmap_node *gossmap_node_byidx(const struct gossmap *map, u32 idx)
{
assert(idx < gossmap_max_node_idx(map));
if (map->node_arr[idx].chan_idxs == NULL)
return NULL;
return &map->node_arr[idx];
}
struct gossmap_chan *gossmap_chan_byidx(const struct gossmap *map, u32 idx)
{
assert(idx < gossmap_max_chan_idx(map));
if (map->chan_arr[idx].plus_scid_off == 0)
return NULL;
return &map->chan_arr[idx];
}
/* htable can't handle NULL or 1 values, so we add 2 */ /* htable can't handle NULL or 1 values, so we add 2 */
static struct gossmap_chan *ptrint2chan(const ptrint_t *pidx) static struct gossmap_chan *ptrint2chan(const ptrint_t *pidx)
{ {

View File

@@ -90,6 +90,9 @@ void gossmap_remove_localmods(struct gossmap *map,
u32 gossmap_node_idx(const struct gossmap *map, const struct gossmap_node *node); u32 gossmap_node_idx(const struct gossmap *map, const struct gossmap_node *node);
u32 gossmap_chan_idx(const struct gossmap *map, const struct gossmap_chan *chan); u32 gossmap_chan_idx(const struct gossmap *map, const struct gossmap_chan *chan);
struct gossmap_node *gossmap_node_byidx(const struct gossmap *map, u32 idx);
struct gossmap_chan *gossmap_chan_byidx(const struct gossmap *map, u32 idx);
/* Every node_idx/chan_idx will be < these. /* Every node_idx/chan_idx will be < these.
* These values can change across calls to gossmap_check. */ * These values can change across calls to gossmap_check. */
u32 gossmap_max_node_idx(const struct gossmap *map); u32 gossmap_max_node_idx(const struct gossmap *map);