Derive-C
Loading...
Searching...
No Matches
complex/employees.c

Composing arenas, maps & vectors Demonstrating embedding vectors inside hashmaps, and making efficient use of small indexes for arenas.

Composing arenas, maps & vectors Demonstrating embedding vectors inside hashmaps, and making efficient use of small indexes for arenas.

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char const* forename;
char const* surname;
} name;
bool name_eq(const name* name_1, const name* name_2) {
if (!name_1 || !name_2)
return false;
if (!name_1->forename || !name_2->forename)
return false;
if (!name_1->surname || !name_2->surname)
return false;
return strcmp(name_1->forename, name_2->forename) == 0 &&
strcmp(name_1->surname, name_2->surname) == 0;
}
typedef struct {
int value;
} age;
typedef struct {
char const* email;
bool age_eq(age const* age_1, age const* age_2) { return age_1->value == age_2->value; }
size_t age_hash(age const* age) { return age->value; }
#define INDEX_BITS 16
#define V employee
#define SELF employees
#define T employees_index
#define SELF same_age_employees
#define K age
#define V same_age_employees
#define EQ age_eq
#define HASH age_hash
#define SELF employees_by_age
typedef struct {
employees data;
employees_by_age by_age;
return (hr_system){
.data = employees_new_with_capacity_for(1000),
.by_age = employees_by_age_new(),
};
}
printf("Adding employee %s %s\n", emp.name.forename, emp.name.surname);
employees_index idx = employees_insert(&self->data, emp);
same_age_employees* idxes = employees_by_age_try_write(&self->by_age, emp.age);
if (!idxes) {
idxes = employees_by_age_insert(&self->by_age, emp.age, same_age_employees_new());
}
same_age_employees_push(idxes, idx);
}
same_age_employees const* idxes = employees_by_age_try_read(&self->by_age, age);
if (!idxes) {
return NULL;
}
if (same_age_employees_size(idxes) == 0) {
return NULL;
}
employees_index const* idx = same_age_employees_read(idxes, same_age_employees_size(idxes) - 1);
return employees_read(&self->data, *idx);
}
employees_delete(&self->data);
employees_by_age_iter iter = employees_by_age_get_iter(&self->by_age);
while (!employees_by_age_iter_empty(&iter)) {
employees_by_age_kv kv = employees_by_age_iter_next(&iter);
same_age_employees_delete(kv.value);
}
employees_by_age_delete(&self->by_age);
}
int main() {
employee frank = {
.age = (age){.value = 22},
.email = "veryverylongemail@someprovider.net",
.name =
(name){
.forename = "Frank",
.surname = "Lee",
},
};
name bob_name = {
.forename = "Bob",
.surname = "Mike",
};
employee bob = {
.age = (age){.value = 22},
.email = "bib@cool.org",
.name = bob_name,
};
employee const* newest_22 = hr_system_newest_of_age(&hr, (age){.value = 22});
assert(newest_22);
assert(name_eq(&newest_22->name, &bob_name));
}
employee const * hr_system_newest_of_age(hr_system const *self, age age)
Definition employees.c:82
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:94
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:106
int value
Definition employees.c:32
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