From 3232e8ea7ff62e8e93239d5eb7099a5ee847c225 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Fri, 27 Oct 2023 20:29:48 +0200 Subject: [PATCH] projet stuff --- TODO.md | 19 +++++++------ includes/Projet.hpp | 29 +++++++++---------- includes/ProtoProjet.hpp | 8 ++---- src/Projet.cpp | 61 +++++++++++++++++++++++++--------------- src/ProtoProjet.cpp | 20 +++++-------- 5 files changed, 73 insertions(+), 64 deletions(-) diff --git a/TODO.md b/TODO.md index 4da9568..24cda77 100644 --- a/TODO.md +++ b/TODO.md @@ -12,22 +12,23 @@ TODO avant rendu : ### Projet -- [ ] Se décompose en tâches -- [ ] Durée totale dépend du degré de parallélisme que le gestionnaire décide -- [ ] Deux natures de projets dépendantent de `Projet` +- [x] Ne dois **pas** être instanciée directement +- [x] Se décompose en tâches (vecteur de tâches) +- [x] Durée totale dépend du degré de parallélisme que le gestionnaire décide +- [x] Deux natures de projets dépendantent de `Projet` - En cours d'élaboration (`ProtoProjet`) - En cours d'exécution (`RunProjet`) -- Peut être vu comme un graphe acyclique (utilisation de `vector`) des tâches +- [x] Peut être vu comme un graphe acyclique (utilisation de `vector`) des tâches - Les sommets sont des tâches - Une tâche `fin` servira de source au graphe - Garder un ordre topologique (triée par dépendances) -- [ ] Mère des deux classes `ProtoProjet` et `RunProjet` -- [ ] Méthodes utiles qu'à ses sous-classes +- [x] Mère des deux classes `ProtoProjet` et `RunProjet` +- [x] Méthodes utiles qu'à ses sous-classes - Méthodes (cf. le PDF du prof) - - [ ] `pick_two_random_tasks()` + - [x] `pick_two_random_tasks()` - [ ] `contains()` - - [ ] Surcharge : afficher toutes les tâches - - [ ] `consult_tasks()` + - [x] Surcharge : afficher toutes les tâches + - [ ] `consult_tasks()` - [ ] `topologicalSort()` #### ProtoProjet diff --git a/includes/Projet.hpp b/includes/Projet.hpp index ba6b81f..a2bc7c9 100644 --- a/includes/Projet.hpp +++ b/includes/Projet.hpp @@ -3,38 +3,37 @@ #include "../includes/Tache.hpp" -struct Projet { - // Alias parce que le type est long - using VecTaches = std::vector>; +class Projet { + // Graphe acyclique + std::vector taches; -private: - // Héritage de tache ? - // Tache fin; - VecTaches taches; + // Première tâche qui sera exécutée + const Tache debut; + + // Source du graphe aka la dernière à être exécutée + const Tache fin; friend std::ostream &operator<<(std::ostream &, const Projet &); -public: +protected: Projet(); // constructor - Projet(VecTaches); // constructor virtual ~Projet(); // destructor Projet(const Projet &); // copy constructor const Projet &operator=(const Projet &); // copy assignement - VecTaches getTaches() { return taches; } - // Retourne une paire d'indentifiants de tâches au hasard - std::pair pick_two_random_tasks(); + const std::pair pick_two_random_tasks() const; // Indique pour une tâche si elle fait partie du projet - Tache *contains(int id); + const Tache *contains(const int) const; + const Tache *contains(const std::string) const; // Donne une version du vecteur de tâches non modifiable - const VecTaches consult_tasks() const { return taches; }; + const std::vector consult_tasks() const; // Corrige les éventuelles anomalies du vector de tâches - const VecTaches topologicalSort(); + void topologicalSort() const; }; #endif diff --git a/includes/ProtoProjet.hpp b/includes/ProtoProjet.hpp index 6cca5fa..a54fc79 100644 --- a/includes/ProtoProjet.hpp +++ b/includes/ProtoProjet.hpp @@ -8,19 +8,17 @@ class ProtoProjet : public Projet { friend std::ostream &operator<<(std::ostream &, const ProtoProjet &); public: - ProtoProjet(); - ProtoProjet(VecTaches taches, Tache debut, - Tache fin); // constructor + ProtoProjet(); // constructor virtual ~ProtoProjet(); // destructor ProtoProjet(const ProtoProjet &); // copy constructor const ProtoProjet &operator=(const ProtoProjet &); // copy assignement // Remet tous les marquages à leur valeur initiale - void cleanMarks(); + /* void cleanMarks(); // Insère une nouvelle tâche en la plaçant entre deux tâches au hasars - bool ajoute(std::string nom, int duree); + bool ajoute(std::string nom, int duree); */ }; #endif diff --git a/src/Projet.cpp b/src/Projet.cpp index c670ef8..c9920b3 100644 --- a/src/Projet.cpp +++ b/src/Projet.cpp @@ -1,12 +1,12 @@ #include "../includes/Projet.hpp" -Projet::Projet() {} - -Projet::Projet(VecTaches t) : taches(t) {} +Projet::Projet() : debut(Tache("Début", 0)), fin(Tache("Fin", 0)) { + fin.depends_from(debut); +} Projet::~Projet() {} -Projet::Projet(const Projet &) {} +Projet::Projet(const Projet &src) : debut(src.debut), fin(src.fin) {} const Projet &Projet::operator=(const Projet &src) { if (this == &src) { @@ -16,42 +16,59 @@ const Projet &Projet::operator=(const Projet &src) { return *this; } -std::pair Projet::pick_two_random_tasks() { +std::ostream &operator<<(std::ostream &out, const Projet &data) { + for (Tache *t : data.taches) { + out << *t << " "; + } + + return out; +} + +const std::pair Projet::pick_two_random_tasks() const { + // Choix aléatoire d'une tâche size_t size = this->taches.size(); size_t rand1 = static_cast(rand()) % size; size_t rand2 = static_cast(rand()) % size; - if (this->taches[rand1].first->depends_from(*this->taches[rand2].first)) - pick_two_random_tasks(); - // Heritage de tache ? - int id1 = this->taches[rand1].first->unique_id; - int id2 = this->taches[rand2].first->unique_id; + Tache *tache1 = this->taches[rand1]; + Tache *tache2 = this->taches[rand2]; + + // - tache2 ne doit pas dépendre transitivement de tache1 + // - permet aussi de vérifier si tache1 == tache2 + if (tache2->depends_from(*tache1)) { + return pick_two_random_tasks(); + } + + int id1 = tache1->unique_id; + int id2 = tache2->unique_id; return std::make_pair(id1, id2); } -// Comment acceder à unique_id ici ? -Tache *Projet::contains(int id) { - for (auto t : this->taches) { - if (id == t.first->unique_id) { - return t.first; +const Tache *Projet::contains(const int id) const { + for (Tache *t : this->taches) { + if (id == t->unique_id) { + return t; } } return nullptr; } -// Comment acceder à taches ici ? -std::ostream &operator<<(std::ostream &out, const Projet &data) { - for (auto t : data.taches) { - out << t.first << " is " << std::boolalpha << t.second; +const Tache *Projet::contains(const std::string name) const { + for (Tache *t : this->taches) { + if (name == t->name) { + return t; + } } - return out; + return nullptr; } -const Projet::VecTaches Projet::topologicalSort() { +const std::vector Projet::consult_tasks() const { return taches; } + +void Projet::topologicalSort() const { // Recupere le calcul fait par PP_postfixe et construit son tri // PP_postfixe(this->taches); - return VecTaches(); /* TODO */ + return; } diff --git a/src/ProtoProjet.cpp b/src/ProtoProjet.cpp index 4488cfc..f5aeefd 100644 --- a/src/ProtoProjet.cpp +++ b/src/ProtoProjet.cpp @@ -2,15 +2,9 @@ ProtoProjet::ProtoProjet() {} -ProtoProjet::ProtoProjet(VecTaches t, Tache debut, Tache fin) : Projet(t) { - /* taches.push_back(debut); - taches.push_back(fin); */ - debut.ajouteDependance(fin); -} - ProtoProjet::~ProtoProjet() {} -ProtoProjet::ProtoProjet(const ProtoProjet &) : Projet(VecTaches() /* TODO*/) {} +ProtoProjet::ProtoProjet(const ProtoProjet &) : Projet() {} const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) { if (this == &src) { @@ -20,12 +14,12 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) { return *this; } -void ProtoProjet::cleanMarks(){ - /* for (auto t : this->getTaches()) { +/* void ProtoProjet::cleanMarks(){ + for (auto t : this->getTaches()) { t.second = false; - } */ + } }; -bool ProtoProjet::ajoute(std::string /* nom */, int /* duree */) { - return false; /* TODO */ -} +bool ProtoProjet::ajoute(std::string nom, int duree) { + return false; +} */