Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <tuple>
- #include <vector>
- #include <algorithm>
- using namespace std;
- // Перечислимый тип для статуса задачи
- enum class TaskStatus {
- NEW, // новая
- IN_PROGRESS, // в разработке
- TESTING, // на тестировании
- DONE // завершена
- };
- // Объявляем тип-синоним для map<TaskStatus, int>,
- // позволяющего хранить количество задач каждого статуса
- using TasksInfo = map<TaskStatus, int>;
- class TeamTasks {
- private:
- map<string, map<TaskStatus, int>> task_info_; //здесь содержится вся информация о текущем статусе задач по каждому исполнителю
- public:
- // Получить статистику по статусам задач конкретного разработчика
- const TasksInfo& GetPersonTasksInfo(const string& person) const
- {
- return task_info_.at(person);
- }
- // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
- void AddNewTask(const string& person)
- {
- task_info_[person][TaskStatus::NEW] += 1;
- task_info_[person][TaskStatus::IN_PROGRESS] += 0;
- task_info_[person][TaskStatus::TESTING] += 0;
- task_info_[person][TaskStatus::DONE] += 0;
- //task_info_.insert({ person, { { TaskStatus::NEW, 1 } } }); // можно использовать но он будет заменять каждый раз новым TaskStatus::NEW
- //task_info_.emplace( person, TaskStatus::NEW, 1 ); // не применим, т.к. нельзя использовать его если внутри map есть другой кнтейнер с ключём??
- }
- // Обновить статусы по данному количеству задач конкретного разработчика,
- // подробности см. ниже
- tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, int task_count)
- {
- TasksInfo refreshed_tasks;
- TasksInfo not_refreshed_tasks;
- map<TaskStatus, int> aux_status;
- vector<TaskStatus> aux_array;
- TasksInfo& ref_at_person = task_info_.at(person); // вспомогательная ссылка
- if (task_info_.count(person) == 0)
- return { refreshed_tasks, not_refreshed_tasks }; // возвращаем пустые контейнеры по условию если нет заданного человека в базе
- int num_of_unsolved = ref_at_person[TaskStatus::NEW] + ref_at_person[TaskStatus::IN_PROGRESS] + ref_at_person[TaskStatus::TESTING]; //считаем количество невыполненных заданий
- if (task_count < num_of_unsolved) //количество обновлений не может превышать количество невыполненных заданий по условию
- num_of_unsolved = task_count;
- for (int i = 0; i < 3;++i)
- {
- if (num_of_unsolved == 0)
- break;
- if (ref_at_person[static_cast<TaskStatus>(i)] <= num_of_unsolved)
- {
- aux_status[static_cast<TaskStatus>(i + 1)] = ref_at_person[static_cast<TaskStatus>(i)];
- num_of_unsolved -= ref_at_person[static_cast<TaskStatus>(i)];
- }
- else
- {
- aux_status[static_cast<TaskStatus>(i + 1)] = num_of_unsolved;
- num_of_unsolved = 0;
- }
- }
- ////выводим aux_status
- //for (const auto& it : aux_status)
- // cout << static_cast<int>(it.first) << " " << (it.second) << endl;
- for (int i = 0; i < 4;++i)
- {
- if (aux_status.count(static_cast<TaskStatus>(i))) //если в aux_status есть элементы со статусом i (NEW, IN_PROGRESS, TESTING или DONE)
- refreshed_tasks[static_cast<TaskStatus>(i)] = aux_status[static_cast<TaskStatus>(i)];
- if (i != 3)
- if (ref_at_person[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)])
- not_refreshed_tasks[static_cast<TaskStatus>(i)] = ref_at_person[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)];
- if (i == 3)
- ref_at_person[static_cast<TaskStatus>(i)] += aux_status[static_cast<TaskStatus>(i)];
- else
- ref_at_person[static_cast<TaskStatus>(i)] += aux_status[static_cast<TaskStatus>(i)] - aux_status[static_cast<TaskStatus>(i + 1)];
- }
- return { refreshed_tasks, not_refreshed_tasks };
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement