summaryrefslogtreecommitdiffhomepage
path: root/examples/complex.c
blob: 584343be849fd584d74898cc73d9a54d1833d028 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stc/cstr.h>

void check_drop(float* v) {printf("destroy %g\n", *v);}

#define i_type FloatStack
#define i_val float
#define i_valdrop check_drop
#define i_valclone(x) x  // required to allow cloning when i_valdrop is defined
                         // (not for carc as it does not use i_valclone to clone).
#include <stc/cstack.h>

#define i_type StackList
#define i_val_bind FloatStack
#define i_opt c_no_cmp
#include <stc/clist.h>

#define i_type ListMap
#define i_key int
#define i_val_bind StackList
#include <stc/cmap.h>

#define i_type MapMap
#define i_key_str
#define i_val_bind ListMap
#include <stc/cmap.h>

// c++:
// using FloatStack = std::stack<float>;
// using map_lst = std::unordered_map<int, std::forward_list<array2f>>;
// using map_map = std::unordered_map<std::string, map_lst>;

int main() {
    int xdim = 4, ydim = 6;
    int x = 1, tableKey = 42;
    const char* strKey = "first";

    c_auto (MapMap, mmap)
    {
        FloatStack stack = FloatStack_with_capacity(xdim * ydim);
        memset(stack.data, 0, xdim*ydim*sizeof *stack.data);
        stack.size = stack.capacity;

        // Put in some data in stack array
        stack.data[x] = 3.1415927f;
        printf("stack size: %" PRIuMAX "\n", FloatStack_size(stack));

        StackList list = StackList_init();
        StackList_push_back(&list, stack);

        ListMap lmap = ListMap_init();
        ListMap_insert(&lmap, tableKey, list);
        MapMap_insert(&mmap, cstr_from(strKey), lmap);

        // Access the data entry
        const ListMap* lmap_p = MapMap_at(&mmap, strKey);
        const StackList* list_p = ListMap_at(lmap_p, tableKey);
        const FloatStack* stack_p = StackList_back(list_p);
        printf("value (%d) is: %f\n", x, *FloatStack_at(stack_p, x));

        stack.data[x] = 1.41421356f; // change the value in array
    }
}