From 6749cc21a2045d307c239d82891cb860687dfd2a Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Tue, 14 Dec 2021 19:50:10 +0100 Subject: Added and renamed some examples. --- examples/rawptr_elements.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 examples/rawptr_elements.c (limited to 'examples/rawptr_elements.c') diff --git a/examples/rawptr_elements.c b/examples/rawptr_elements.c new file mode 100644 index 00000000..c5416822 --- /dev/null +++ b/examples/rawptr_elements.c @@ -0,0 +1,62 @@ +#include +#include + +struct { double x, y; } typedef Point; + +// Set of Point pointers: define all template parameters "in-line" +// Note it may be simpler to use a cbox for this. +#define i_key Point* +#define i_keydel(x) c_free(*(x)) +#define i_keyfrom(x) c_new(Point, *(x)) +#define i_hash(x, n) c_default_hash(*(x), sizeof *(x)) +#define i_equ(x, y) c_memcmp_equalto(*(x), *(y)) +#define i_tag pnt +#include + +// Map of int64 pointers: For fun, define valraw as int64_t for easy emplace call! +typedef int64_t inttype; +#define i_key_str +#define i_valraw inttype +#define i_val inttype* +#define i_valdel(x) c_free(*(x)) +#define i_valfrom(raw) c_new(inttype, raw) +#define i_valto(x) **(x) +#include + +int main() +{ + c_auto (cset_pnt, set, cpy) + { + printf("Set with pointer elements:\n"); + // c++: set.insert(new Point{1.2, 3.4}); + cset_pnt_insert(&set, c_new(Point, {1.2, 3.4})); + Point* q = *cset_pnt_insert(&set, c_new(Point, {6.1, 4.7})).ref; + cset_pnt_insert(&set, c_new(Point, {5.7, 2.3})); + + cpy = cset_pnt_clone(set); + cset_pnt_erase(&cpy, q); + + printf("set:"); + c_foreach (i, cset_pnt, set) + printf(" (%g %g)", i.ref[0]->x, i.ref[0]->y); + + printf("\ncpy:"); + c_foreach (i, cset_pnt, cpy) + printf(" (%g %g)", i.ref[0]->x, i.ref[0]->y); + puts(""); + } + + c_auto (cmap_str, map) + { + printf("\nMap with pointer elements:\n"); + cmap_str_insert(&map, cstr_new("testing"), c_new(inttype, 999)); + cmap_str_insert(&map, cstr_new("done"), c_new(inttype, 111)); + + // Emplace: implicit key, val construction using i_keyfrom/i_valfrom: + cmap_str_emplace(&map, "hello", 200); + cmap_str_emplace(&map, "goodbye", 400); + + c_forpair (name, number, cmap_str, map) + printf("%s: %zd\n", _.name.str, *_.number); + } +} -- cgit v1.2.3