Derive-C
Loading...
Searching...
No Matches
employees.c File Reference
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <derive-c/macros/iterators.h>
#include <derive-c/structures/arena/template.h>
#include <derive-c/structures/vector/template.h>
#include <derive-c/structures/hashmap/template.h>
Include dependency graph for employees.c:

Go to the source code of this file.

Classes

struct  name
 
struct  age
 
struct  employee
 
struct  hr_system
 

Macros

#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
 

Functions

bool name_eq (const name *name_1, const name *name_2)
 
bool age_eq (age const *age_1, age const *age_2)
 
size_t age_hash (age const *age)
 
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_delete (hr_system *self)
 
int main ()
 

Macro Definition Documentation

◆ EQ

#define EQ   age_eq

Definition at line 55 of file employees.c.

◆ HASH

#define HASH   age_hash

Definition at line 56 of file employees.c.

◆ INDEX_BITS

#define INDEX_BITS   16

Definition at line 44 of file employees.c.

◆ K

#define K   age

Definition at line 53 of file employees.c.

◆ SELF [1/3]

#define SELF   employees

Definition at line 46 of file employees.c.

◆ SELF [2/3]

#define SELF   same_age_employees

Definition at line 46 of file employees.c.

◆ SELF [3/3]

#define SELF   employees_by_age

Definition at line 46 of file employees.c.

◆ T

#define T   employees_index

Definition at line 49 of file employees.c.

◆ V [1/2]

#define V   employee

Definition at line 45 of file employees.c.

◆ V [2/2]

#define V   same_age_employees

Definition at line 45 of file employees.c.

Function Documentation

◆ age_eq()

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

Definition at line 41 of file employees.c.

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

◆ age_hash()

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

Definition at line 42 of file employees.c.

42{ return age->value; }
int value
Definition employees.c:32

◆ hr_system_delete()

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

Definition at line 94 of file employees.c.

94 {
95 employees_delete(&self->data);
96
97 employees_by_age_iter iter = employees_by_age_get_iter(&self->by_age);
98 while (!employees_by_age_iter_empty(&iter)) {
99 employees_by_age_kv kv = employees_by_age_iter_next(&iter);
100 same_age_employees_delete(kv.value);
101 }
102
103 employees_by_age_delete(&self->by_age);
104}
employees data
Definition employees.c:61
employees_by_age by_age
Definition employees.c:62
Here is the caller graph for this function:

◆ hr_system_new()

hr_system hr_system_new ( )
Examples
complex/employees.c.

Definition at line 65 of file employees.c.

65 {
66 return (hr_system){
67 .data = employees_new_with_capacity_for(1000),
68 .by_age = employees_by_age_new(),
69 };
70}
Here is the caller graph for this function:

◆ hr_system_new_employee()

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

Definition at line 72 of file employees.c.

72 {
73 printf("Adding employee %s %s\n", emp.name.forename, emp.name.surname);
74 employees_index idx = employees_insert(&self->data, emp);
75 same_age_employees* idxes = employees_by_age_try_write(&self->by_age, emp.age);
76 if (!idxes) {
77 idxes = employees_by_age_insert(&self->by_age, emp.age, same_age_employees_new());
78 }
79 same_age_employees_push(idxes, idx);
80}
age age
Definition employees.c:38
name name
Definition employees.c:36
char const * forename
Definition employees.c:15
char const * surname
Definition employees.c:16
Here is the caller graph for this function:

◆ 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 82 of file employees.c.

82 {
83 same_age_employees const* idxes = employees_by_age_try_read(&self->by_age, age);
84 if (!idxes) {
85 return NULL;
86 }
87 if (same_age_employees_size(idxes) == 0) {
88 return NULL;
89 }
90 employees_index const* idx = same_age_employees_read(idxes, same_age_employees_size(idxes) - 1);
91 return employees_read(&self->data, *idx);
92}
Here is the caller graph for this function:

◆ main()

int main ( )
Examples
complex/employees.c, complex/prime_sieve.c, structures/arena.c, structures/hashmap.c, structures/option.c, structures/staticvec.c, and structures/vector.c.

Definition at line 106 of file employees.c.

106 {
108
109 employee frank = {
110 .age = (age){.value = 22},
111 .email = "veryverylongemail@someprovider.net",
112 .name =
113 (name){
114 .forename = "Frank",
115 .surname = "Lee",
116 },
117 };
118 hr_system_new_employee(&hr, frank);
119
120 name bob_name = {
121 .forename = "Bob",
122 .surname = "Mike",
123 };
124 employee bob = {
125 .age = (age){.value = 22},
126 .email = "bib@cool.org",
127 .name = bob_name,
128 };
129 hr_system_new_employee(&hr, bob);
130
131 employee const* newest_22 = hr_system_newest_of_age(&hr, (age){.value = 22});
132 assert(newest_22);
133 assert(name_eq(&newest_22->name, &bob_name));
134
135 hr_system_delete(&hr);
136}
employee const * hr_system_newest_of_age(hr_system const *self, age age)
Definition employees.c:82
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
hr_system hr_system_new()
Definition employees.c:65
void hr_system_new_employee(hr_system *self, employee emp)
Definition employees.c:72
Here is the call graph for this function:
Here is the caller graph for this function:

◆ name_eq()

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

Definition at line 19 of file employees.c.

19 {
20 if (!name_1 || !name_2)
21 return false;
22 if (!name_1->forename || !name_2->forename)
23 return false;
24 if (!name_1->surname || !name_2->surname)
25 return false;
26
27 return strcmp(name_1->forename, name_2->forename) == 0 &&
28 strcmp(name_1->surname, name_2->surname) == 0;
29}
Here is the caller graph for this function: