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;
if (!name_1 || !name_2)
return false;
return false;
return false;
}
typedef struct {
int value;
typedef struct {
char const* email;
#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;
.data = employees_new_with_capacity_for(1000),
.by_age = employees_by_age_new(),
};
}
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);
}
.age = (
age){.value = 22},
.email = "veryverylongemail@someprovider.net",
.name =
.forename = "Frank",
.surname = "Lee",
},
};
.forename = "Bob",
.surname = "Mike",
};
.age = (
age){.value = 22},
.email = "bib@cool.org",
.name = bob_name,
};
assert(newest_22);
}
employee const * hr_system_newest_of_age(hr_system const *self, age age)
bool age_eq(age const *age_1, age const *age_2)
bool name_eq(const name *name_1, const name *name_2)
void hr_system_delete(hr_system *self)
size_t age_hash(age const *age)
hr_system hr_system_new()
void hr_system_new_employee(hr_system *self, employee emp)