/* * Copyright (c) Camden Dixie O'Brien * SPDX-License-Identifier: AGPL-3.0-only */ #ifndef ROTAGEN_H #define ROTAGEN_H #include #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