Derive-C
Loading...
Searching...
No Matches
decomposed.c
Go to the documentation of this file.
1
4
5#include <inttypes.h>
6#include <stdbool.h>
7#include <stdint.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11
13#include <derive-c/alloc/std.h>
15#include <derive-c/utils/for.h>
16
17#define KEY uint32_t
18#define KEY_EQ uint32_t_eq
19#define KEY_HASH hash_id_uint32_t
20#define VALUE char const*
21#define NAME id_to_name
23
24void print_map(id_to_name const* map) {
25 printf("Map has items:\n");
26 size_t pos = 0;
27 FOR_CONST(id_to_name, map, iter, entry) {
28 printf("position: %zu key: %" PRIu32 " string: %s\n", pos, *entry.key, *entry.value);
29 pos++;
30 }
31}
32
34 printf("Id to Name Map Example:\n");
35 id_to_name map = id_to_name_new(stdalloc_get());
36
37 id_to_name_insert(&map, 23, "hello");
38 id_to_name_insert(&map, 10, "bob");
39 id_to_name_insert(&map, 42, "meaning");
40 DC_ASSERT(strcmp(*id_to_name_read(&map, 42), "meaning") == 0);
41
42 print_map(&map);
43
44 char const** entry = id_to_name_write(&map, 23);
45 DC_ASSERT(entry);
46 *entry = "a different string!";
47
48 print_map(&map);
49
50 id_to_name_debug(&map, dc_debug_fmt_new(), stdout);
51
52 id_to_name_delete(&map);
53}
54
55struct report_id {
56 char* name;
57 uint32_t section;
58};
59
60void report_id_debug(struct report_id const* self, dc_debug_fmt fmt, FILE* stream) {
61 (void)fmt;
62 fprintf(stream, " report_id@%p { name: \"%s\", section: %d}", self, self->name, self->section);
63}
64
65bool report_id_equality(struct report_id const* report_1, struct report_id const* report_2) {
66 return strcmp(report_1->name, report_2->name) == 0 && report_1->section == report_2->section;
67}
68
69size_t report_id_hash(struct report_id const* report_id) {
71 hash_id_uint32_t(&report_id->section));
72}
73
74void report_id_delete(struct report_id* self) { free(self->name); }
75
76struct report {
78 int value;
79};
80
81void report_debug(struct report const* self, dc_debug_fmt fmt, FILE* stream) {
82 (void)fmt;
83 fprintf(stream, " report@%p { description: \"%s\", value: %d}", self, self->description,
84 self->value);
85}
86
87void report_delete(struct report* self) { free(self->description); }
88
89#define KEY struct report_id
90#define KEY_EQ report_id_equality
91#define KEY_HASH report_id_hash
92#define KEY_DELETE report_id_delete
93#define KEY_DEBUG report_id_debug
94#define VALUE struct report
95#define VALUE_DELETE report_delete
96#define VALUE_DEBUG report_debug
97#define NAME report_map
99
101 printf("Report Map Example:\n");
102 report_map map = report_map_new(stdalloc_get());
103
104 struct report_id id1 = {.name = strdup("Report A"), .section = 1};
105 struct report_id id2 = {.name = strdup("Report B"), .section = 2};
106
107 report_map_insert(&map, id1,
108 (struct report){.description = strdup("Description A"), .value = 100});
109 report_map_insert(&map, id2,
110 (struct report){.description = strdup("Description B"), .value = 200});
111
112 DC_ASSERT(strcmp(report_map_read(&map, id1)->description, "Description A") == 0);
113
114 {
115 size_t pos = 0;
116 FOR_CONST(report_map, &map, iter, entry) {
117 printf("Position: %zu Key: %s Section: %u Value: %d\n", pos, entry.key->name,
118 entry.key->section, entry.value->value);
119 pos++;
120 }
121 }
122
123 report_map_debug(&map, dc_debug_fmt_new(), stdout);
124
125 struct report entry = report_map_remove(&map, id1);
126 report_delete(&entry);
127
128 report_map_debug(&map, dc_debug_fmt_new(), stdout);
129
130 report_map_delete(&map);
131}
132
134 char value[4];
135};
136
137void fixed_string_debug(struct fixed_string const* self, dc_debug_fmt fmt, FILE* stream) {
138 (void)fmt;
139 fprintf(stream, "fixed_string@%p { value: \"%.*s\" }", self, 4, self->value);
140}
141
142bool fixed_string_eq(struct fixed_string const* str1, struct fixed_string const* str2) {
143 return memcmp(str1->value, str2->value, sizeof(str1->value)) == 0;
144}
145
146size_t fixed_string_hash(struct fixed_string const* str) {
147 return hash_murmurhash_string_4(str->value);
148}
149
150#define KEY struct fixed_string
151#define KEY_EQ fixed_string_eq
152#define KEY_HASH fixed_string_hash
153#define KEY_DEBUG fixed_string_debug
154#define VALUE uint32_t
155#define NAME fixed_string_map
157
159 printf("Fixed Strings Example:\n");
160 fixed_string_map map = fixed_string_map_new(stdalloc_get());
161
162 struct fixed_string key1 = {.value = "abc"};
163 struct fixed_string key2 = {.value = "def"};
164 struct fixed_string key3 = {.value = "ghi"};
165
166 fixed_string_map_insert(&map, key1, 123);
167 fixed_string_map_insert(&map, key2, 456);
168 fixed_string_map_insert(&map, key3, 789);
169
170 DC_ASSERT(*fixed_string_map_read(&map, key1) == 123);
171 DC_ASSERT(*fixed_string_map_read(&map, key2) == 456);
172 DC_ASSERT(*fixed_string_map_read(&map, key3) == 789);
173
174 size_t pos = 0;
175 FOR_CONST(fixed_string_map, &map, iter, entry) {
176 printf("Position: %zu Key: %.3s Value: %u\n", pos, entry.key->value, *entry.value);
177 pos++;
178 }
179
180 fixed_string_map_debug(&map, dc_debug_fmt_new(), stdout);
181
182 fixed_string_map_delete(&map);
183}
184
static void free(SELF *self, void *ptr)
Definition template.h:56
void report_debug(struct report const *self, dc_debug_fmt fmt, FILE *stream)
Definition decomposed.c:81
void id_to_name_example()
Definition decomposed.c:33
void print_map(id_to_name const *map)
Definition decomposed.c:24
void report_delete(struct report *self)
Definition decomposed.c:87
void report_id_debug(struct report_id const *self, dc_debug_fmt fmt, FILE *stream)
Definition decomposed.c:60
void report_map_example()
Definition decomposed.c:100
void fixed_string_debug(struct fixed_string const *self, dc_debug_fmt fmt, FILE *stream)
Definition decomposed.c:137
bool report_id_equality(struct report_id const *report_1, struct report_id const *report_2)
Definition decomposed.c:65
void fixed_string_example()
Definition decomposed.c:158
bool fixed_string_eq(struct fixed_string const *str1, struct fixed_string const *str2)
Definition decomposed.c:142
void report_id_delete(struct report_id *self)
Definition decomposed.c:74
int main()
Definition decomposed.c:185
size_t report_id_hash(struct report_id const *report_id)
Definition decomposed.c:69
size_t fixed_string_hash(struct fixed_string const *str)
Definition decomposed.c:146
static dc_debug_fmt dc_debug_fmt_new()
Definition fmt.h:14
#define FOR_CONST(TYPE, INSTANCE, ITER, ITEM)
Definition for.h:10
size_t hash_murmurhash_string(const char *str)
Definition hashers.h:62
static size_t hash_combine(size_t seed, size_t h)
Definition hashers.h:88
#define DC_ASSERT(expr,...)
Definition panic.h:36
Debug format helpers for debug printin data structures.
Definition fmt.h:10
char value[4]
Definition decomposed.c:134
char * name
Definition decomposed.c:56
uint32_t section
Definition decomposed.c:57
char * description
Definition decomposed.c:77
int value
Definition decomposed.c:78
static FILE * stream(SELF *self)
Opens a file for.
Definition template.h:107