summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/mapmap.c
blob: cad5e46290342021c87fc46393aa436c90886ce3 (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
63
64
65
66
67
68
69
70
71
72
73
74
// create a structure like: std::map<std::string, std::map<std::string, std::string>>:

#include <stc/cstr.h>

// People: std::map<std::string, std::string>
#define i_type People
#define i_key_str // name
#define i_val_str // email
#define i_keydrop(p) (printf("kdrop: %s\n", cstr_str(p)), cstr_drop(p)) // override
#include <stc/csmap.h>

// Departments: std::map<std::string, People>
#define i_type Departments
#define i_key_str // dep. name
#define i_valclass People
// i_key_str implies:
//  #define i_tag str
//  #define i_key cstr
//  #define i_keyclone cstr_clone
//  #define i_keydrop cstr_drop
//  #define i_cmp cstr_cmp
//  #define i_hash cstr_hash
// i_valclass implies:
//  #define i_val People
//  #define i_valclone People_clone
//  #define i_valdrop People_drop
#include <stc/csmap.h>


void add(Departments* deps, const char* name, const char* email, const char* dep)
{
    People *people = &Departments_emplace(deps, dep, People_init()).ref->second;
    People_emplace_or_assign(people, name, email);
}

int contains(Departments* map, const char* name)
{
    int count = 0;
    c_foreach (i, Departments, *map)
        if (People_contains(&i.ref->second, name))
            ++count;
    return count;
}

int main(void)
{
    c_auto (Departments, map)
    {
        add(&map, "Anna Kendro", "[email protected]", "Support");
        add(&map, "Terry Dane", "[email protected]", "Development");
        add(&map, "Kik Winston", "[email protected]", "Finance");
        add(&map, "Nancy Drew", "[email protected]", "Development");
        add(&map, "Nick Denton", "[email protected]", "Finance");
        add(&map, "Stan Whiteword", "[email protected]", "Marketing");
        add(&map, "Serena Bath", "[email protected]", "Support");
        add(&map, "Patrick Dust", "[email protected]", "Finance");
        add(&map, "Red Winger", "[email protected]", "Marketing");
        add(&map, "Nick Denton", "[email protected]", "Support");
        add(&map, "Colin Turth", "[email protected]", "Support");
        add(&map, "Dennis Kay", "[email protected]", "Marketing");
        add(&map, "Anne Dickens", "[email protected]", "Development");

        c_foreach (i, Departments, map)
            c_forpair (name, email, People, i.ref->second)
                printf("%s: %s - %s\n", cstr_str(&i.ref->first), cstr_str(_.name), cstr_str(_.email));
        puts("");

        printf("found Nick Denton: %d\n", contains(&map, "Nick Denton"));
        printf("found Patrick Dust: %d\n", contains(&map, "Patrick Dust"));
        printf("found Dennis Kay: %d\n", contains(&map, "Dennis Kay"));
        printf("found Serena Bath: %d\n", contains(&map, "Serena Bath"));
        puts("Done");
    }
}