Derive-C
Loading...
Searching...
No Matches
employees.c File Reference

Go to the source code of this file.

Data Structures

struct  name
struct  age
struct  employee
struct  hr_system

Macros

#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

Functions

bool name_eq (const name *name_1, const name *name_2)
void name_debug (const name *self, dc_debug_fmt fmt, FILE *stream)
bool age_eq (age const *age_1, age const *age_2)
size_t age_hash (age const *age)
void age_debug (age const *self, dc_debug_fmt fmt, FILE *stream)
void employee_debug (employee const *self, dc_debug_fmt fmt, FILE *stream)
hr_system hr_system_new ()
void hr_system_new_employee (hr_system *self, employee emp)
employee const * hr_system_newest_of_age (hr_system const *self, age age)
void hr_system_debug (hr_system const *self, dc_debug_fmt fmt, FILE *stream)
void hr_system_delete (hr_system *self)
int main ()

Macro Definition Documentation

◆ INDEX_BITS

#define INDEX_BITS   16

Definition at line 73 of file employees.c.

◆ ITEM

#define ITEM   employees_index_t

Definition at line 79 of file employees.c.

◆ ITEM_DEBUG

#define ITEM_DEBUG   employees_index_t_debug

Definition at line 80 of file employees.c.

◆ KEY

#define KEY   age

Definition at line 84 of file employees.c.

◆ KEY_DEBUG

#define KEY_DEBUG   age_debug

Definition at line 87 of file employees.c.

◆ KEY_EQ

#define KEY_EQ   age_eq

Definition at line 85 of file employees.c.

◆ KEY_HASH

#define KEY_HASH   age_hash

Definition at line 86 of file employees.c.

◆ NAME [1/3]

#define NAME   employees_by_age

Definition at line 76 of file employees.c.

◆ NAME [2/3]

#define NAME   same_age_employees

Definition at line 76 of file employees.c.

◆ NAME [3/3]

#define NAME   employees

Definition at line 76 of file employees.c.

◆ VALUE [1/2]

#define VALUE   same_age_employees

Definition at line 74 of file employees.c.

◆ VALUE [2/2]

#define VALUE   employee

Definition at line 74 of file employees.c.

◆ VALUE_DEBUG [1/2]

#define VALUE_DEBUG   same_age_employees_debug

Definition at line 75 of file employees.c.

◆ VALUE_DEBUG [2/2]

#define VALUE_DEBUG   employee_debug

Definition at line 75 of file employees.c.

Function Documentation

◆ age_debug()

void age_debug ( age const * self,
dc_debug_fmt fmt,
FILE * stream )
Examples
complex/employees.c.

Definition at line 44 of file employees.c.

44 {
45 (void)fmt;
46 fprintf(stream, "%d years", self->value);
47}
static FILE * stream(SELF *self)
Opens a file for.
Definition template.h:107

◆ age_eq()

bool age_eq ( age const * age_1,
age const * age_2 )
Examples
complex/employees.c.

Definition at line 42 of file employees.c.

42{ return age_1->value == age_2->value; }

◆ age_hash()

size_t age_hash ( age const * age)
Examples
complex/employees.c.

Definition at line 43 of file employees.c.

43{ return age->value; }
int value
Definition employees.c:39

◆ employee_debug()

void employee_debug ( employee const * self,
dc_debug_fmt fmt,
FILE * stream )
Examples
complex/employees.c.

Definition at line 55 of file employees.c.

55 {
56 fprintf(stream, "employee@%p {\n", self);
57 fmt = dc_debug_fmt_scope_begin(fmt);
58
59 dc_debug_fmt_print(fmt, stream, "name: ");
60 name_debug(&self->name, fmt, stream);
61 fprintf(stream, ",\n");
62
63 dc_debug_fmt_print(fmt, stream, "email: \"%s\",\n", self->email);
64
65 dc_debug_fmt_print(fmt, stream, "age: ");
66 age_debug(&self->age, fmt, stream);
67 fprintf(stream, ",\n");
68
69 fmt = dc_debug_fmt_scope_end(fmt);
70 dc_debug_fmt_print(fmt, stream, "}");
71}
void age_debug(age const *self, dc_debug_fmt fmt, FILE *stream)
Definition employees.c:44
void name_debug(const name *self, dc_debug_fmt fmt, FILE *stream)
Definition employees.c:32
dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
Definition fmt.h:39
dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
Definition fmt.h:33
static void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
Definition fmt.h:22

◆ hr_system_debug()

void hr_system_debug ( hr_system const * self,
dc_debug_fmt fmt,
FILE * stream )
Examples
complex/employees.c.

Definition at line 129 of file employees.c.

129 {
130 fprintf(stream, "hr_system@%p {\n", self);
131 fmt = dc_debug_fmt_scope_begin(fmt);
132
133 dc_debug_fmt_print(fmt, stream, "data: ");
134 employees_debug(&self->data, fmt, stream);
135 fprintf(stream, ",\n");
136
137 dc_debug_fmt_print(fmt, stream, "by_age: ");
138 employees_by_age_debug(&self->by_age, fmt, stream);
139 fprintf(stream, ",\n");
140
141 fmt = dc_debug_fmt_scope_end(fmt);
142 dc_debug_fmt_print(fmt, stream, "}");
143}

◆ hr_system_delete()

void hr_system_delete ( hr_system * self)
Examples
complex/employees.c.

Definition at line 145 of file employees.c.

145 {
146 employees_delete(&self->data);
147
148 FOR(employees_by_age, &self->by_age, iter, entry) { same_age_employees_delete(entry.value); }
149
150 employees_by_age_delete(&self->by_age);
151}
#define FOR(TYPE, INSTANCE, ITER, ITEM)
Definition for.h:9
employees data
Definition employees.c:94
employees_by_age by_age
Definition employees.c:95

◆ hr_system_new()

hr_system hr_system_new ( )
Examples
complex/employees.c.

Definition at line 98 of file employees.c.

98 {
99 return (hr_system){
100 .data = employees_new_with_capacity_for(1000, stdalloc_get()),
101 .by_age = employees_by_age_new(stdalloc_get()),
102 };
103}

◆ hr_system_new_employee()

void hr_system_new_employee ( hr_system * self,
employee emp )
Examples
complex/employees.c.

Definition at line 105 of file employees.c.

105 {
106 printf("Adding employee %s %s\n", emp.name.forename, emp.name.surname);
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);
109 if (!idxes) {
110 idxes =
111 employees_by_age_insert(&self->by_age, emp.age, same_age_employees_new(stdalloc_get()));
112 }
113 same_age_employees_push(idxes, idx);
114}
age age
Definition employees.c:52
name name
Definition employees.c:50
char const * forename
Definition employees.c:16
char const * surname
Definition employees.c:17

◆ hr_system_newest_of_age()

employee const * hr_system_newest_of_age ( hr_system const * self,
age age )
Examples
complex/employees.c.

Definition at line 116 of file employees.c.

116 {
117 same_age_employees const* idxes = employees_by_age_try_read(&self->by_age, age);
118 if (!idxes) {
119 return NULL;
120 }
121 if (same_age_employees_size(idxes) == 0) {
122 return NULL;
123 }
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);
127}

◆ main()

int main ( )

Definition at line 153 of file employees.c.

153 {
155
156 employee frank = {
157 .age = (age){.value = 22},
158 .email = "veryverylongemail@someprovider.net",
159 .name =
160 (name){
161 .forename = "Frank",
162 .surname = "Lee",
163 },
164 };
165 hr_system_new_employee(&hr, frank);
166
167 name bob_name = {
168 .forename = "Bob",
169 .surname = "Mike",
170 };
171 employee bob = {
172 .age = (age){.value = 22},
173 .email = "bib@cool.org",
174 .name = bob_name,
175 };
176 hr_system_new_employee(&hr, bob);
177
178 employee const* newest_22 = hr_system_newest_of_age(&hr, (age){.value = 22});
179 DC_ASSERT(newest_22);
180 DC_ASSERT(name_eq(&newest_22->name, &bob_name));
181
182 hr_system_debug(&hr, dc_debug_fmt_new(), stdout);
183
184 hr_system_delete(&hr);
185}
employee const * hr_system_newest_of_age(hr_system const *self, age age)
Definition employees.c:116
bool name_eq(const name *name_1, const name *name_2)
Definition employees.c:20
void hr_system_delete(hr_system *self)
Definition employees.c:145
hr_system hr_system_new()
Definition employees.c:98
void hr_system_new_employee(hr_system *self, employee emp)
Definition employees.c:105
void hr_system_debug(hr_system const *self, dc_debug_fmt fmt, FILE *stream)
Definition employees.c:129
static dc_debug_fmt dc_debug_fmt_new()
Definition fmt.h:14
#define DC_ASSERT(expr,...)
Definition panic.h:36

◆ name_debug()

void name_debug ( const name * self,
dc_debug_fmt fmt,
FILE * stream )
Examples
complex/employees.c.

Definition at line 32 of file employees.c.

32 {
33 (void)fmt;
34 fprintf(stream, "name@%p { forename: \"%s\", surname: \"%s\" }", self, self->forename,
35 self->surname);
36}

◆ name_eq()

bool name_eq ( const name * name_1,
const name * name_2 )
Examples
complex/employees.c.

Definition at line 20 of file employees.c.

20 {
21 if (!name_1 || !name_2)
22 return false;
23 if (!name_1->forename || !name_2->forename)
24 return false;
25 if (!name_1->surname || !name_2->surname)
26 return false;
27
28 return strcmp(name_1->forename, name_2->forename) == 0 &&
29 strcmp(name_1->surname, name_2->surname) == 0;
30}