rotagen/rotagen.h

64 lines
1.3 KiB
C

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