schedule_maker / track.cc
track.cc
Raw
#include <vector>
#include "track.h"

using namespace std;

// Reset het aantal vakkenPerDag en het aantal tussenuren
// van de track op elke dag naar 0
void Track::resetTrack() {
    for(int i = 0; i < MaxNrDagen; i++) {
        vakkenPerDag[i] = 0;
        tussenuur[i] = 0;
    }
} // Track::resetTrack

// Default constructor
Track::Track() {
    trackId = -1;
    resetTrack(); // reset is ook gelijk de beginsituatie
} // Track::Track

// Setter voor het Id van het roosterobject
void Track::setId(int const id0) {
    trackId = id0;
} // Track::setId

// Voegt een vakId toe aan de vector met alle vakIds van de track
void Track::addVak(int const vakId) {
    vakIds.push_back(vakId);
} // Track::addVak

// Setter voor of de track theoretisch mogelijk is
void Track::setTheoretischMogelijk(bool const theoretiscMogelijk0) {
    theoretischMogelijk = theoretiscMogelijk0;
} // Track::setTheoretischMogelijk

// Verhoogt het aantal tussenuren die de track heeft op deze dag
void Track::nieuwTussenuur(int const dag) {
    tussenuur[dag]++;
} // Track::nieuwTussenuur

// Verlaagt het aantal tussenuren die de track heeft op deze dag
void Track::verwijderTussenuur(int const dag) {
    tussenuur[dag]--;
} // Track::verwijderTussenuur

// Verhoogt het aantal ingeroosterde vakken die de track heeft op deze dag
void Track::nieuwVakOpDag(int const dag) {
    vakkenPerDag[dag]++;
} // Track::nieuwVakOpDag

 // Verlaagt het aantal ingeroosterde vakken die de track heeft op deze dag
void Track::verwijderVakOpDag(int const dag) {
    vakkenPerDag[dag]--;
} // Track::verwijderVakOpDag

// Getter voor de id van de track
int const Track::getId() {
    return trackId;
} // Track::getId

// Retourneert hoeveel ingeroosterde vakken de track op deze dag heeft
int const Track::aantalVakken(int const dag) {
    return vakkenPerDag[dag];
} // Track::aantalVakken

// Getter voor het aantal tussenuren de track heeft op deze dag
int const Track::getTussenuren(int const dag) {
    return tussenuur[dag];
} // Track::getTussenuren

// Getter voor of de track theoretisch mogelijk is
bool const Track::getTheoretischMogelijk() {
    return theoretischMogelijk;
} // Track::getTheoretischMogelijk

// Getter voor de id's van de vakken die de track heeft
vector<int> Track::getVakIds() {
    return vakIds;
} // Track::getVakIds

// Geeft de slechtste 'rang' terug die weergeeft hoe goed de
// beschikbaarheid is in de tracks van het vak op een tijdslot
// De rangen zijn als volgt:
// -2 (Het slechtst): er is al een vak van deze track op dit tijdslot
// -1 (slecht): meer dan een tussenuur op een dag
// 0 (goed): er zijn nog geen andere vakken van de track ingeroosterd
// 1 (goed): er komt een tussenuur
// 2 (het best): het vak ligt vlak na een ander vak in de track
int const Track::trackBeschikbaarheid(int const tijdslot, int const nrUrenPerDag) {
    int const dag = tijdslot / nrUrenPerDag;

    if(vakkenPerDag[dag] == 0 || !theoretischMogelijk) {
        return 0;
    } // Nog geen andere vakken van de track zijn ingeroosterd of track is theoretisch onmogelijk

    if(!isTijdslotBeschikbaar(tijdslot)) {
        return -2;
    } // Er is al een vak van deze track op dit tijdslot

    if((dag == 0 && tijdslot != 0) || (dag != 0 && (tijdslot - (nrUrenPerDag * dag)) != 0)) {
        if(!isTijdslotBeschikbaar(tijdslot - 1)) {
            return 2;
        } // Er is een vak in het vorige tijdslot
    } // Het is niet het eerste tijdslot van de dag

    if(!tussenuur[dag]) {
        if((dag == 0 && tijdslot > 1) || (dag != 0 && (tijdslot - (nrUrenPerDag * dag)) > 1)) {
            if(!isTijdslotBeschikbaar(tijdslot - 2)) {
                return 1;
            } // Er is een vak in het tijdslot twee uren ervoor
        } // Het is niet het eerste of tweede tijdslot van de dag
    } // Nog geen tussenuur op deze dag
    return -1; // De track is slecht beschikbaar
} // Track::trackBeschikbaarheid