ets_multimap.c

Include dependency graph for ets_multimap.c:

digraph { graph [bgcolor="#00000000"] node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2] edge [color="#1414CE"] "5" [label="atom.h" tooltip="atom.h"] "7" [label="atom_table.h" tooltip="atom_table.h"] "13" [label="erl_nif.h" tooltip="erl_nif.h"] "16" [label="ets.h" tooltip="ets.h"] "1" [label="/__w/AtomVM/AtomVM/src/libAtomVM/ets_multimap.c" tooltip="/__w/AtomVM/AtomVM/src/libAtomVM/ets_multimap.c" fillcolor="#BFBFBF"] "30" [label="ets_multimap.h" tooltip="ets_multimap.h"] "4" [label="globalcontext.h" tooltip="globalcontext.h"] "23" [label="intn.h" tooltip="intn.h"] "18" [label="list.h" tooltip="list.h"] "27" [label="mailbox.h" tooltip="mailbox.h"] "24" [label="memory.h" tooltip="memory.h"] "25" [label="refc_binary.h" tooltip="refc_binary.h"] "26" [label="resources.h" tooltip="resources.h"] "19" [label="smp.h" tooltip="smp.h"] "17" [label="synclist.h" tooltip="synclist.h"] "20" [label="term.h" tooltip="term.h"] "14" [label="term_typedef.h" tooltip="term_typedef.h"] "28" [label="timer_list.h" tooltip="timer_list.h"] "9" [label="utils.h" tooltip="utils.h"] "29" [label="valueshashtable.h" tooltip="valueshashtable.h"] "2" [label="assert.h" tooltip="assert.h"] "10" [label="inttypes.h" tooltip="inttypes.h"] "15" [label="limits.h" tooltip="limits.h"] "8" [label="stdbool.h" tooltip="stdbool.h"] "11" [label="stddef.h" tooltip="stddef.h"] "3" [label="stdint.h" tooltip="stdint.h"] "12" [label="stdio.h" tooltip="stdio.h"] "6" [label="stdlib.h" tooltip="stdlib.h"] "22" [label="string.h" tooltip="string.h"] "21" [label="sys/types.h" tooltip="sys/types.h"] "5" -> "3" [dir=forward tooltip="include"] "5" -> "6" [dir=forward tooltip="include"] "7" -> "8" [dir=forward tooltip="include"] "7" -> "5" [dir=forward tooltip="include"] "7" -> "9" [dir=forward tooltip="include"] "13" -> "14" [dir=forward tooltip="include"] "16" -> "8" [dir=forward tooltip="include"] "16" -> "17" [dir=forward tooltip="include"] "16" -> "20" [dir=forward tooltip="include"] "1" -> "2" [dir=forward tooltip="include"] "1" -> "3" [dir=forward tooltip="include"] "1" -> "4" [dir=forward tooltip="include"] "1" -> "20" [dir=forward tooltip="include"] "1" -> "30" [dir=forward tooltip="include"] "30" -> "4" [dir=forward tooltip="include"] "30" -> "20" [dir=forward tooltip="include"] "4" -> "3" [dir=forward tooltip="include"] "4" -> "5" [dir=forward tooltip="include"] "4" -> "7" [dir=forward tooltip="include"] "4" -> "13" [dir=forward tooltip="include"] "4" -> "16" [dir=forward tooltip="include"] "4" -> "18" [dir=forward tooltip="include"] "4" -> "27" [dir=forward tooltip="include"] "4" -> "19" [dir=forward tooltip="include"] "4" -> "17" [dir=forward tooltip="include"] "4" -> "20" [dir=forward tooltip="include"] "4" -> "28" [dir=forward tooltip="include"] "4" -> "29" [dir=forward tooltip="include"] "23" -> "8" [dir=forward tooltip="include"] "23" -> "22" [dir=forward tooltip="include"] "23" -> "9" [dir=forward tooltip="include"] "18" -> "8" [dir=forward tooltip="include"] "27" -> "8" [dir=forward tooltip="include"] "27" -> "18" [dir=forward tooltip="include"] "27" -> "14" [dir=forward tooltip="include"] "27" -> "9" [dir=forward tooltip="include"] "24" -> "3" [dir=forward tooltip="include"] "24" -> "6" [dir=forward tooltip="include"] "24" -> "13" [dir=forward tooltip="include"] "24" -> "14" [dir=forward tooltip="include"] "24" -> "9" [dir=forward tooltip="include"] "25" -> "8" [dir=forward tooltip="include"] "25" -> "6" [dir=forward tooltip="include"] "25" -> "18" [dir=forward tooltip="include"] "25" -> "26" [dir=forward tooltip="include"] "26" -> "6" [dir=forward tooltip="include"] "26" -> "13" [dir=forward tooltip="include"] "26" -> "18" [dir=forward tooltip="include"] "26" -> "27" [dir=forward tooltip="include"] "26" -> "24" [dir=forward tooltip="include"] "26" -> "17" [dir=forward tooltip="include"] "19" -> "8" [dir=forward tooltip="include"] "17" -> "12" [dir=forward tooltip="include"] "17" -> "18" [dir=forward tooltip="include"] "17" -> "19" [dir=forward tooltip="include"] "20" -> "21" [dir=forward tooltip="include"] "20" -> "8" [dir=forward tooltip="include"] "20" -> "3" [dir=forward tooltip="include"] "20" -> "12" [dir=forward tooltip="include"] "20" -> "6" [dir=forward tooltip="include"] "20" -> "22" [dir=forward tooltip="include"] "20" -> "5" [dir=forward tooltip="include"] "20" -> "23" [dir=forward tooltip="include"] "20" -> "24" [dir=forward tooltip="include"] "20" -> "25" [dir=forward tooltip="include"] "20" -> "26" [dir=forward tooltip="include"] "20" -> "9" [dir=forward tooltip="include"] "20" -> "14" [dir=forward tooltip="include"] "14" -> "2" [dir=forward tooltip="include"] "14" -> "15" [dir=forward tooltip="include"] "14" -> "10" [dir=forward tooltip="include"] "14" -> "3" [dir=forward tooltip="include"] "28" -> "8" [dir=forward tooltip="include"] "28" -> "3" [dir=forward tooltip="include"] "28" -> "18" [dir=forward tooltip="include"] "9" -> "10" [dir=forward tooltip="include"] "9" -> "8" [dir=forward tooltip="include"] "9" -> "11" [dir=forward tooltip="include"] "9" -> "12" [dir=forward tooltip="include"] "9" -> "6" [dir=forward tooltip="include"] "29" -> "11" [dir=forward tooltip="include"] "29" -> "3" [dir=forward tooltip="include"] }

Defines

DYNARRAY_INITIAL_CAPACITY 8
DYNARRAY_GROWTH_FACTOR 2
LARGE_PRIME_INITIAL 16777259
LARGE_PRIME_ATOM 16777643
LARGE_PRIME_INTEGER 16777781
LARGE_PRIME_FLOAT 16777973
LARGE_PRIME_PID 16778147
LARGE_PRIME_REF 16778441
LARGE_PRIME_BINARY 16780483
LARGE_PRIME_TUPLE 16778821
LARGE_PRIME_LIST 16779179
LARGE_PRIME_MAP 16779449
LARGE_PRIME_PORT 16778077

Functions

static uint32_t hash_term(term t, GlobalContext *global)
static EtsMultimapEntry *entry_new(term tuple)
static void entry_delete(EtsMultimapEntry *entry, GlobalContext *global)
static EtsMultimapNode *node_new(EtsMultimapNode *next, EtsMultimapEntry *entries)
static void node_delete(EtsMultimapNode *node, GlobalContext *global)
static ets_result_t node_find(EtsMultimap *multimap, term key, EtsMultimapNode **out_node, GlobalContext *global)
static term node_key(EtsMultimap *multimap, EtsMultimapNode *node)
static void multimap_to_single(EtsMultimap *multimap, GlobalContext *global)
static void insert_revert(EtsMultimap *multimap, EtsMultimapEntry **entries, size_t count, GlobalContext *global)
static ets_result_t tuple_exists(EtsMultimapNode *node, term tuple, bool *exists, GlobalContext *global)
EtsMultimap *ets_multimap_new(ets_multimap_type_t type, size_t key_index)

Create a new multimap.

Parameters:
  • type – the multimap type

  • index – the index of the tuple element to use as key

Returns:

the created multimap, or NULL on error

void ets_multimap_delete(EtsMultimap *multimap, GlobalContext *global)

Delete the multimap and all its contents.

Parameters:
  • multimap – the multimap

  • global – the global context

ets_result_t ets_multimap_lookup(EtsMultimap *multimap, term key, term **tuples, size_t *count, GlobalContext *global)

Lookup tuples by key.

Note

Terms returned by this function come from the ETS heap and should be copied to the process heap if needed.

Note

The returned tuples are ordered in reverse insertion order (most recently added elements first).

Warning

The caller is responsible for freeing the memory pointed to by tuples using free(). When count is zero, memory is not allocated.

Parameters:
  • multimap – the multimap

  • key – the key to lookup

  • tuples[out] the found tuples (or NULL to only get the count)

  • count[out] the number of found tuples; must not be NULL

  • global – the global context

Returns:

EtsOk on success, otherwise an error status

ets_result_t ets_multimap_insert(EtsMultimap *multimap, term *tuples, size_t count, GlobalContext *global)

Insert one or more tuples into the multimap.

Note

Terms passed to this function will be copied to the ETS heap.

Parameters:
  • multimap – the multimap

  • tuples – the tuples to insert

  • count – the number of tuples to insert

Returns:

EtsOk on success, otherwise an error status

ets_result_t ets_multimap_remove(EtsMultimap *multimap, term key, GlobalContext *global)

Remove all tuples with the given key.

Parameters:
  • multimap – the multimap

  • key – the key to lookup

  • global – the global context

Returns:

EtsOk on success, otherwise an error status

ets_result_t ets_multimap_remove_tuple(EtsMultimap *multimap, term tuple, GlobalContext *global)

Remove a given tuple from the multimap.

Parameters:
  • multimap – the multimap

  • tuple – the tuple to remove

  • global – the global context

Returns:

EtsOk on success, otherwise an error status

static uint32_t hash_atom(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_integer(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_float(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_local_pid(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_local_port(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_external_pid(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_external_port(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_local_reference(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_external_reference(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_binary(term t, uint32_t h, GlobalContext *global)
static uint32_t hash_term_incr(term t, uint32_t h, GlobalContext *global)