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 <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;
}
(void)fmt;
fprintf(
stream,
"name@%p { forename: \"%s\", surname: \"%s\" }", self, self->
forename,
}
typedef struct {
int value;
(void)fmt;
}
typedef struct {
char const* email;
fprintf(
stream,
"employee@%p {\n", self);
}
#define INDEX_BITS 16
#define VALUE employee
#define VALUE_DEBUG employee_debug
#define NAME employees
#define ITEM employees_index_t
#define ITEM_DEBUG employees_index_t_debug
#define NAME same_age_employees
#define KEY age
#define KEY_EQ age_eq
#define KEY_HASH age_hash
#define KEY_DEBUG age_debug
#define VALUE same_age_employees
#define VALUE_DEBUG same_age_employees_debug
#define NAME employees_by_age
typedef struct {
employees_by_age by_age;
.data = employees_new_with_capacity_for(1000, stdalloc_get()),
.by_age = employees_by_age_new(stdalloc_get()),
};
}
employees_index_t 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(stdalloc_get()));
}
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_t const* idx =
same_age_employees_read(idxes, same_age_employees_size(idxes) - 1);
return employees_read(&self->
data, *idx);
}
fprintf(
stream,
"hr_system@%p {\n", self);
}
employees_delete(&self->
data);
FOR(employees_by_age, &self->
by_age, iter, entry) { same_age_employees_delete(entry.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,
};
}
static ITEM * data(SELF *self)
void age_debug(age const *self, dc_debug_fmt fmt, FILE *stream)
employee const * hr_system_newest_of_age(hr_system const *self, age age)
void employee_debug(employee const *self, dc_debug_fmt fmt, FILE *stream)
void name_debug(const name *self, dc_debug_fmt fmt, FILE *stream)
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)
void hr_system_debug(hr_system const *self, dc_debug_fmt fmt, FILE *stream)
dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
static void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
static dc_debug_fmt dc_debug_fmt_new()
#define FOR(TYPE, INSTANCE, ITER, ITEM)
#define DC_ASSERT(expr,...)
Debug format helpers for debug printin data structures.
static FILE * stream(SELF *self)
Opens a file for.