59 lines
1.2 KiB
C
59 lines
1.2 KiB
C
#ifndef ROTAGEN_H
|
|
#define ROTAGEN_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#define MAX_PEOPLE 32
|
|
#define MAX_JOBS 32
|
|
#define MAX_SLOTS 32
|
|
#define MAX_CONSTRAINTS 32
|
|
|
|
#define MAX_STRING_LEN 32
|
|
|
|
enum constraint_type {
|
|
JOB_EXEMPTION_CONSTRAINT,
|
|
SLOT_EXEMPTION_CONSTRAINT,
|
|
};
|
|
|
|
struct constraint {
|
|
int person;
|
|
enum constraint_type type;
|
|
union {
|
|
int job; /* Job constraints */
|
|
int slot; /* Slot constraints */
|
|
} object;
|
|
};
|
|
|
|
struct assignment {
|
|
int person;
|
|
int job;
|
|
int slot;
|
|
};
|
|
|
|
struct slot_result {
|
|
struct assignment assignments[MAX_JOBS];
|
|
};
|
|
|
|
typedef char string[MAX_STRING_LEN];
|
|
|
|
struct config {
|
|
string people[MAX_PEOPLE];
|
|
int num_people;
|
|
string jobs[MAX_JOBS];
|
|
int num_jobs;
|
|
string slots[MAX_SLOTS];
|
|
int num_slots;
|
|
struct constraint constraints[MAX_CONSTRAINTS];
|
|
int num_constraints;
|
|
};
|
|
|
|
void generate_rota(struct slot_result *rota_out);
|
|
void generate_assignment(int slot, int job, struct assignment *assignment_out);
|
|
bool satisfies_assignment_constraints(const struct assignment *assignment);
|
|
bool previously_allocated(int previous_assignments[MAX_JOBS], int person);
|
|
bool satisfies_slot_constraints(const struct slot_result *slot);
|
|
void print_rota(const struct slot_result *rota);
|
|
void read_config(const char *path, struct config *config_out);
|
|
|
|
#endif
|