From c4b8e2dd7a32df9fd556461dca4b3bedcb938b9d Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 3 Dec 2023 13:41:29 +0300 Subject: [PATCH] improved Array: use std::vector --- Planner/Array.h | 41 ++++++++++++++------------------- Planner/CompilationSupervisor.h | 2 +- Planner/CompilationTask.h | 3 ++- Planner/RunSupervisor.h | 2 +- Planner/RunTask.h | 2 +- Planner/Supervisor.h | 19 +++++++-------- Planner/Task.h | 2 +- Planner/Text.h | 16 +++++++------ 8 files changed, 42 insertions(+), 45 deletions(-) diff --git a/Planner/Array.h b/Planner/Array.h index c9fe79e8..cc40d539 100644 --- a/Planner/Array.h +++ b/Planner/Array.h @@ -3,42 +3,35 @@ #include #include #include +#include template class Array { -protected: - long length; - T** elements; +private: + std::vector elements; + public: - Array() { - length = 0; - elements = NULL; - } + Array() { } + virtual ~Array() { - if (elements != NULL) { - for (long i = 0; i < length; ++i) - delete elements[i]; - delete[] elements; - } + for (auto& elem : elements) + delete elem; + elements.clear(); } + void add(T* new_line) { - T** buf = new T * [length + 1]; - for (long i = 0; i < length; ++i) { - buf[i] = elements[i]; - } - buf[length] = new_line; - length++; - delete[] elements; - elements = buf; - buf = NULL; + elements.push_back(new_line); } - long getLength() { - return length; + + long getLength() const { + return elements.size(); } + T* get(long i) { return elements[i]; } - T** getElements() { + + const std::vector& getElements() const { return elements; } }; \ No newline at end of file diff --git a/Planner/CompilationSupervisor.h b/Planner/CompilationSupervisor.h index 1ebd3f72..b757451e 100644 --- a/Planner/CompilationSupervisor.h +++ b/Planner/CompilationSupervisor.h @@ -9,7 +9,7 @@ public: this->init("compilationTasks", 4); } CompilationTask* getTaskById(long task_id) { - for (long i = 0; i < length; ++i) { + for (long i = 0; i < getLength(); ++i) { CompilationTask* task = get(i); if (task->getId() == task_id) return task; diff --git a/Planner/CompilationTask.h b/Planner/CompilationTask.h index c10b4547..18059a6c 100644 --- a/Planner/CompilationTask.h +++ b/Planner/CompilationTask.h @@ -13,11 +13,12 @@ public: void setMakefileText(String* makefile_text_in) { makefile_text = String(makefile_text_in->getCharArray(), '|'); } - virtual void print() { + virtual void print() const { printf("id=%ld; maxtime=%d; test_id=%s\n", id, maxtime, test_id.getCharArray()); printf("makefile_text=%s\n", makefile_text.getCharArray()); } + CompilationTask(Text* lines, int offset) :Task(lines, offset) { setTestId(lines->get(offset + 2)); setMakefileText(lines->get(offset + 3)); diff --git a/Planner/RunSupervisor.h b/Planner/RunSupervisor.h index 64dcd9ee..de5c5e8f 100644 --- a/Planner/RunSupervisor.h +++ b/Planner/RunSupervisor.h @@ -8,7 +8,7 @@ public: RunSupervisor(CompilationSupervisor* compilationSupervisor) { this->init("runTasks", 8); //проверить отмененные задачи. - for (long i = 0; i < this->length; ++i) { + for (long i = 0; i < getLength(); ++i) { RunTask* task = this->get(i); CompilationTask* parent = compilationSupervisor->getTaskById(task->getTestCompilationTaskId()); task->setState((parent->getState() == Done) ? Waiting : Canceled); diff --git a/Planner/RunTask.h b/Planner/RunTask.h index e1def5be..622fc876 100644 --- a/Planner/RunTask.h +++ b/Planner/RunTask.h @@ -11,7 +11,7 @@ class RunTask : public Task { String args; CompilationTask* parent; public: - virtual void print() { + virtual void print() const { printf("id=%ld; maxtime=%d; testcompilationtask_id=%ld; matrix=%s; environments=%s; usr_par=%s; args=%s kernels=%d\n", id, maxtime, diff --git a/Planner/Supervisor.h b/Planner/Supervisor.h index 504adaa5..d5b11760 100644 --- a/Planner/Supervisor.h +++ b/Planner/Supervisor.h @@ -38,18 +38,19 @@ public: } //- void print() { - for (long i = 0; i < this->length; ++i) - this->elements[i]->print(); + for (auto& elem : this->getElements()) + elem->print(); } + void init(const char* fileName, int recordSize) { state = WorkspacesCreation; File* packedTasks = new File(fileName); Text* lines = packedTasks->readLines(); - this->length = lines->getLength() / recordSize; - this->elements = new T * [this->length]; + + const long length = lines->getLength() / recordSize; int offset = 0; - for (int i = 0; i < this->length; ++i) { - this->elements[i] = new T(lines, offset); + for (int i = 0; i < length; ++i) { + this->add(new T(lines, offset)); offset += recordSize; } delete packedTasks; @@ -59,13 +60,13 @@ public: saveState(); long activeCount = 0; //todo обязательно убрать отладочную печать. - printf("tasks count = %ld\n", this->length); + printf("tasks count = %ld\n", this->getLength()); while (this->state != End) { // printf("state=%d\n", this->state); // printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels); activeCount = 0; - for (long i = 0; i < this->length; ++i) { - T* task = this->elements[i]; + for (long i = 0; i < this->getLength(); ++i) { + T* task = this->get(i); switch (this->state) { case WorkspacesCreation: if (task->getState() == Waiting) { diff --git a/Planner/Task.h b/Planner/Task.h index 47ee4d14..0cb161c3 100644 --- a/Planner/Task.h +++ b/Planner/Task.h @@ -104,7 +104,7 @@ public: setMaxtime(lines->get(offset + 1)); workspace = packageWorkspace + "/" + String(id); } - virtual void print() = 0; + virtual void print() const = 0; //- virtual void prepareWorkspace() {} virtual String getLaunchScriptText() = 0; diff --git a/Planner/Text.h b/Planner/Text.h index 6f216a67..8f154458 100644 --- a/Planner/Text.h +++ b/Planner/Text.h @@ -5,18 +5,20 @@ class Text : public Array { public: - void Print() { - printf("text length=%ld\n", length); + void Print() const { + printf("text length=%ld\n", this->getLength()); - for (long i = 0; i < length; ++i) { - printf("i=%ld; [%s]\n", i, elements[i]->getCharArray()); + auto elems = this->getElements(); + for (size_t i = 0; i < elems.size(); ++i) { + printf("i=%ld; [%s]\n", i, elems[i]->getCharArray()); // elements[i]->println(); } } - bool hasMatch(const String& s) { - for (long i = 0; i < length; ++i) { - if (s.contains(*elements[i])) { + bool hasMatch(const String& s) const { + + for (auto& elem : this->getElements()) { + if (s.contains(*elem)) { //printf("match: [%s]\n", elements[i]->getCharArray()); return true; }