gwion-util
utilities for the Gwion project
Loading...
Searching...
No Matches
scope.c
Go to the documentation of this file.
1#include "gwion_util.h"
2
3ANN static inline Map scope_back(const Scope s) {
4 return (Map)&VPTR((Vector)s, VLEN(s) - 1);
5}
6
7ANN vtype scope_lookup0(const Scope s, const vtype xid) {
8 const Map map = scope_back(s);
9 const vtype ret = map_get(map, xid);
10 if (!ret && VLEN(s) == 1) return map_get(&s->map, (vtype)xid);
11 return ret;
12}
13
14ANN vtype scope_lookup1(const Scope s, const vtype xid) {
15 for (m_uint i = VLEN(s) + 1; --i;) {
16 const Map map = (Map)&VPTR(s, i - 1);
17 const vtype ret = map_get(map, xid);
18 if (ret) return ret;
19 }
20 return map_get(&s->map, (vtype)xid);
21}
22
23ANN vtype scope_lookup2(const Scope s, const vtype xid) {
24 const Map map = (Map)&VPTR(s, 0);
25 return map_get(map, xid) ?: map_get(&s->map, (vtype)xid);
26}
27
28ANN void scope_add(const Scope s, const vtype xid, const vtype value) {
29 if (VLEN(s) > 1)
30 map_set(scope_back(s), xid, value);
31 else
32 map_set(&s->map, xid, value);
33}
34
35ANN void scope_commit(const Scope s) {
36 map_commit((Map)&VPTR(s, 0), &s->map);
37 map_clear(&s->map);
38}
39
43 scope_push(p, a);
44}
45
47 Scope a = mp_calloc(p, Scope);
48 scope_init(p, a);
49 return a;
50}
51
57
60 mp_free(p, Scope, a);
61}
62
63ANN bool scope_iter(struct scope_iter *iter, void *ret) {
64 m_uint size = map_size(&iter->s->map);
65 const m_uint vsize = vector_size((Vector)iter->s);
66 const m_uint vec = vsize - iter->vec;
67 Map map = &iter->s->map;
68 if (vsize == iter->vec) {
69 if (iter->idx == size) return false;
70 } else {
71 map = (Map)&VPTR(iter->s, vec - 1);
72 size = map_size(map);
73 if (iter->idx == size) {
74 ++iter->vec;
75 iter->idx = 0;
76 return scope_iter(iter, ret);
77 }
78 }
79 *(vtype *)ret = map_at(map, size - ++iter->idx);
80 return true;
81}
#define VLEN(v)
Definition container.h:10
uintptr_t vtype
Definition container.h:14
#define VPTR(v, i)
Definition container.h:12
#define ANN
Definition defs.h:19
uintptr_t m_uint
Definition gwcommon.h:11
meta header (use this to include the whole library)
ANN void map_release(const Map map)
Definition map.c:61
ANN vtype map_get(const Map map, const vtype key)
Definition map.c:20
ANN void map_set(const Map map, const vtype key, const vtype ptr)
Definition map.c:32
ANN void map_clear(const Map v)
Definition map.c:3
ANN void map_commit(const restrict Map map, const restrict Map commit)
Definition map.c:56
static ANN vtype map_size(const Map map)
Definition map.h:28
struct Map_ * Map
static ANN vtype map_at(const Map map, const vtype index)
Definition map.h:19
#define mp_calloc(p, name)
Definition mpool.h:26
#define mp_free(p, name, a)
Definition mpool.h:27
ANN vtype scope_lookup0(const Scope s, const vtype xid)
Definition scope.c:7
ANN vtype scope_lookup1(const Scope s, const vtype xid)
Definition scope.c:14
ANN Scope new_scope(MemPool p)
Definition scope.c:46
ANN vtype scope_lookup2(const Scope s, const vtype xid)
Definition scope.c:23
ANN void scope_commit(const Scope s)
Definition scope.c:35
ANN bool scope_iter(struct scope_iter *iter, void *ret)
Definition scope.c:63
ANN void scope_release(Scope a)
Definition scope.c:52
ANN void scope_add(const Scope s, const vtype xid, const vtype value)
Definition scope.c:28
static ANN Map scope_back(const Scope s)
Definition scope.c:3
ANN void scope_init(MemPool p, Scope a)
Definition scope.c:40
ANN void free_scope(MemPool p, Scope a)
Definition scope.c:58
static ANN void scope_push(MemPool p NUSED, const Scope s)
Definition scope.h:28
Definition map.h:7
Definition scope.h:7
struct Map_ map
Definition scope.h:9
m_uint vec
Definition scope.h:14
m_uint idx
Definition scope.h:15
const Scope s
Definition scope.h:13
ANN void vector_release(const Vector v)
Definition vector.c:14
ANN void vector_init(const Vector v)
Definition vector.c:3
static ANN vtype vector_size(Vector const v)
Definition vector.h:29