21 if (!name_1 || !name_2)
34 fprintf(
stream,
"name@%p { forename: \"%s\", surname: \"%s\" }", (
void*)self, self->
forename,
56 fprintf(
stream,
"employee@%p {\n", (
void*)self);
75#define VALUE_DEBUG employee_debug
79#define ITEM employees_index_t
80#define ITEM_DEBUG employees_index_t_debug
81#define NAME same_age_employees
86#define KEY_HASH age_hash
87#define KEY_DEBUG age_debug
88#define VALUE same_age_employees
89#define VALUE_DEBUG same_age_employees_debug
90#define NAME employees_by_age
100 .data = employees_new_with_capacity_for(1000, stdalloc_get_ref()),
101 .by_age = employees_by_age_new(stdalloc_get_ref()),
107 employees_index_t idx = employees_insert(&self->
data, emp);
108 same_age_employees* idxes = employees_by_age_try_write(&self->
by_age, emp.
age);
110 idxes = employees_by_age_insert(&self->
by_age, emp.
age,
111 same_age_employees_new(stdalloc_get_ref()));
113 same_age_employees_push(idxes, idx);
117 same_age_employees
const* idxes = employees_by_age_try_read(&self->
by_age,
age);
121 if (same_age_employees_size(idxes) == 0) {
124 employees_index_t
const* idx =
125 same_age_employees_read(idxes, same_age_employees_size(idxes) - 1);
126 return employees_read(&self->
data, *idx);
130 fprintf(
stream,
"hr_system@%p {\n", (
void*)self);
146 employees_delete(&self->
data);
148 DC_FOR(employees_by_age, &self->
by_age, iter, entry) { same_age_employees_delete(entry.value); }
150 employees_by_age_delete(&self->
by_age);
157 .age = (
age){.value = 22},
158 .email =
"veryverylongemail@someprovider.net",
172 .age = (
age){.value = 22},
173 .email =
"bib@cool.org",
static void name_debug(const name *self, dc_debug_fmt fmt, FILE *stream)
static void age_debug(age const *self, dc_debug_fmt fmt, FILE *stream)
static void hr_system_new_employee(hr_system *self, employee emp)
static bool age_eq(age const *age_1, age const *age_2)
static bool name_eq(const name *name_1, const name *name_2)
static void hr_system_delete(hr_system *self)
static employee const * hr_system_newest_of_age(hr_system const *self, age age)
static void hr_system_debug(hr_system const *self, dc_debug_fmt fmt, FILE *stream)
static size_t age_hash(age const *age)
static hr_system hr_system_new()
static void employee_debug(employee const *self, dc_debug_fmt fmt, FILE *stream)
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_new()
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
#define DC_FOR(TYPE, INSTANCE, ITER, ITEM)
#define DC_ASSERT(expr,...)
Debug format helpers for debug printin data structures.
static DC_PUBLIC FILE * stream(SELF *self)