Serene Runtime 1.0.0
C runtime for the Serene programming language
Loading...
Searching...
No Matches
maps.c File Reference
Include dependency graph for maps.c:

Go to the source code of this file.

Functions

static bool srn_vmap_cmp (srn_context_t *ctx, const hmap_key_t *a, const hmap_key_t *b)
 
static hmap_hash_t srn_vmap_hash (srn_context_t *ctx, const hmap_key_t *k)
 
srn_value_tsrn_map_empty (srn_context_t *ctx, srn_metadata_t *metadata)
 
srn_value_tsrn_map_assoc (srn_context_t *ctx, srn_metadata_t *metadata, srn_value_t *map, srn_value_t *key, srn_value_t *value)
 

Variables

static const hmap_control_t value_map
 

Function Documentation

◆ srn_map_assoc()

srn_value_t * srn_map_assoc ( srn_context_t * ctx,
srn_metadata_t * metadata,
srn_value_t * map,
srn_value_t * key,
srn_value_t * value )

Definition at line 66 of file maps.c.

67 {
68 PANIC_IF_NULL(ctx);
69 PANIC_IF_NULL(map);
70 PANIC_IF_NULL(key);
71 PANIC_IF_NULL(value);
72
73 if (!IS_A(map, VMap)) {
74 return srn_errors_make_error(ctx, metadata, ABSURD, "expected a map");
75 }
76
77 hmap_key_t *k = hmap_make_key(ctx, key, sizeof(*key));
78
79 srn_map_t *old = AS_MAP(map);
80 srn_map_t *neu = ALLOC(ctx, srn_map_t);
81
82 neu->inner = value_map.insert(&value_map, ctx, &old->inner, k, value);
83 return srn_value_make(ctx, VMap, metadata, (void *)neu);
84}
#define ALLOC(ctx, T)
Definition context.h:82
srn_value_t * srn_value_make(srn_context_t *ctx, srn_value_tag_t tag, srn_metadata_t *metadata, void *payload)
Creates a new serene value.
Definition core.c:24
@ VMap
Definition core.h:126
#define AS_MAP(value_ref)
Definition core.h:177
#define IS_A(value_ref, field)
Definition core.h:162
@ ABSURD
Definition errors.h:45
hmap_key_t * hmap_make_key(srn_context_t *ctx, void *data, size_t len)
Create a new key out of the given data, with the given len.
Definition hashmap.c:627
static const hmap_control_t value_map
Definition maps.c:52
Note: For key equality we use the memcpy function.
Definition hashmap.h:66
A persistent, immutable map.
Definition maps.h:29
hmap_t inner
Definition maps.h:30
#define PANIC_IF_NULL(ptr)
Definition utils.h:64
Here is the call graph for this function:

◆ srn_map_empty()

srn_value_t * srn_map_empty ( srn_context_t * ctx,
srn_metadata_t * metadata )

Definition at line 59 of file maps.c.

59 {
60 PANIC_IF_NULL(ctx);
61 srn_map_t *m = ALLOC(ctx, srn_map_t);
62 m->inner = hmap_empty(ctx);
63 return srn_value_make(ctx, VMap, metadata, (void *)m);
64}
hmap_t hmap_empty(srn_context_t *ctx)
Create, initialize and return a new hashmap.
Definition hashmap.c:612
Here is the call graph for this function:

◆ srn_vmap_cmp()

static bool srn_vmap_cmp ( srn_context_t * ctx,
const hmap_key_t * a,
const hmap_key_t * b )
static

Definition at line 28 of file maps.c.

28 {
29 srn_value_t *va = (srn_value_t *)a->data;
30 srn_value_t *vb = (srn_value_t *)b->data;
31 srn_value_t *res = srn_value_eq(ctx, va, vb);
32 switch (TYPE(res)) {
33 case VFalse:
34 return false;
35 case VTrue:
36 return true;
37 default:
38 PANIC("Should never happen");
39 }
40}
#define TYPE(value_ref)
Definition core.h:160
@ VFalse
Definition core.h:115
@ VTrue
Definition core.h:114
srn_value_t * srn_value_eq(srn_context_t *ctx, const srn_value_t *a, const srn_value_t *b)
Check to values for equality. Return a boolean.
Definition protocols.c:38
void * data
len 0 -> data == nullptr
Definition hashmap.h:68
#define PANIC(msg)
Definition utils.h:51
Here is the call graph for this function:

◆ srn_vmap_hash()

static hmap_hash_t srn_vmap_hash ( srn_context_t * ctx,
const hmap_key_t * k )
static

Definition at line 43 of file maps.c.

43 {
46 srn_value_t *v = (srn_value_t *)k->data;
47
49 return srn_value_hash(ctx, v);
50}
srn_hash_t srn_value_hash(srn_context_t *ctx, const srn_value_t *v)
Compute the xxHash32 of a value using the engine seed.
Definition protocols.c:138
Here is the call graph for this function:

Variable Documentation

◆ value_map

const hmap_control_t value_map
static
Initial value:
= {
.cmp = &srn_vmap_cmp,
.hash = &srn_vmap_hash,
.insert = hmap_insert_ctl,
.lookup = hmap_lookup_ctl,
}
void * hmap_lookup_ctl(const hmap_control_t *ctl, srn_context_t *ctx, const hmap_t *hmap, const hmap_key_t *k, void *default_value)
Just like the hmap_lookup function but, it receives a hmap_control_t to customize the comparison and ...
Definition hashmap.c:597
hmap_t hmap_insert_ctl(const hmap_control_t *ctl, srn_context_t *ctx, const hmap_t *hmap, hmap_key_t *k, void *v)
Just like the hmap_insert function but, it receives a hmap_control_t to customize the comparison and ...
Definition hashmap.c:559
static hmap_hash_t srn_vmap_hash(srn_context_t *ctx, const hmap_key_t *k)
Definition maps.c:43
static bool srn_vmap_cmp(srn_context_t *ctx, const hmap_key_t *a, const hmap_key_t *b)
Definition maps.c:28

Definition at line 52 of file maps.c.

52 {
53 .cmp = &srn_vmap_cmp,
54 .hash = &srn_vmap_hash,
55 .insert = hmap_insert_ctl,
56 .lookup = hmap_lookup_ctl,
57};