Derive-C
Loading...
Searching...
No Matches
employees.c
Go to the documentation of this file.
1
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include <derive-c/alloc/std.h>
13
14typedef struct {
15 char const* forename;
16 char const* surname;
17} name;
18
19bool name_eq(const name* name_1, const name* name_2) {
20 if (!name_1 || !name_2)
21 return false;
22 if (!name_1->forename || !name_2->forename)
23 return false;
24 if (!name_1->surname || !name_2->surname)
25 return false;
26
27 return strcmp(name_1->forename, name_2->forename) == 0 &&
28 strcmp(name_1->surname, name_2->surname) == 0;
29}
30
31typedef struct {
32 int value;
33} age;
34
35typedef struct {
37 char const* email;
39} employee;
40
41bool age_eq(age const* age_1, age const* age_2) { return age_1->value == age_2->value; }
42size_t age_hash(age const* age) { return age->value; }
43
44#define INDEX_BITS 16
45#define VALUE employee
46#define NAME employees
48
49#define ITEM employees_index_t
50#define NAME same_age_employees
52
53#define KEY age
54#define KEY_EQ age_eq
55#define KEY_HASH age_hash
56#define VALUE same_age_employees
57#define NAME employees_by_age
59
60typedef struct {
61 employees data;
62 employees_by_age by_age;
63} hr_system;
64
66 return (hr_system){
67 .data = employees_new_with_capacity_for(1000, stdalloc_get()),
68 .by_age = employees_by_age_new(stdalloc_get()),
69 };
70}
71
73 printf("Adding employee %s %s\n", emp.name.forename, emp.name.surname);
74 employees_index_t idx = employees_insert(&self->data, emp);
75 same_age_employees* idxes = employees_by_age_try_write(&self->by_age, emp.age);
76 if (!idxes) {
77 idxes =
78 employees_by_age_insert(&self->by_age, emp.age, same_age_employees_new(stdalloc_get()));
79 }
80 same_age_employees_push(idxes, idx);
81}
82
84 same_age_employees const* idxes = employees_by_age_try_read(&self->by_age, age);
85 if (!idxes) {
86 return NULL;
87 }
88 if (same_age_employees_size(idxes) == 0) {
89 return NULL;
90 }
91 employees_index_t const* idx =
92 same_age_employees_read(idxes, same_age_employees_size(idxes) - 1);
93 return employees_read(&self->data, *idx);
94}
95
97 employees_delete(&self->data);
98
99 employees_by_age_iter iter = employees_by_age_get_iter(&self->by_age);
100 employees_by_age_kv const* entry = NULL;
101 while ((entry = employees_by_age_iter_next(&iter))) {
102 same_age_employees_delete(entry->value);
103 }
104
105 employees_by_age_delete(&self->by_age);
106}
107
108int main() {
110
111 employee frank = {
112 .age = (age){.value = 22},
113 .email = "veryverylongemail@someprovider.net",
114 .name =
115 (name){
116 .forename = "Frank",
117 .surname = "Lee",
118 },
119 };
120 hr_system_new_employee(&hr, frank);
121
122 name bob_name = {
123 .forename = "Bob",
124 .surname = "Mike",
125 };
126 employee bob = {
127 .age = (age){.value = 22},
128 .email = "bib@cool.org",
129 .name = bob_name,
130 };
131 hr_system_new_employee(&hr, bob);
132
133 employee const* newest_22 = hr_system_newest_of_age(&hr, (age){.value = 22});
134 ASSERT(newest_22);
135 ASSERT(name_eq(&newest_22->name, &bob_name));
136
137 hr_system_delete(&hr);
138}
employee const * hr_system_newest_of_age(hr_system const *self, age age)
Definition employees.c:83
bool age_eq(age const *age_1, age const *age_2)
Definition employees.c:41
bool name_eq(const name *name_1, const name *name_2)
Definition employees.c:19
void hr_system_delete(hr_system *self)
Definition employees.c:96
size_t age_hash(age const *age)
Definition employees.c:42
hr_system hr_system_new()
Definition employees.c:65
void hr_system_new_employee(hr_system *self, employee emp)
Definition employees.c:72
int main()
Definition employees.c:108
#define ASSERT(expr,...)
Definition macros.h:42
int value
Definition employees.c:32
char const * email
Definition employees.c:37
age age
Definition employees.c:38
name name
Definition employees.c:36
employees data
Definition employees.c:61
employees_by_age by_age
Definition employees.c:62
char const * forename
Definition employees.c:15
char const * surname
Definition employees.c:16