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 <cstdint>
- using namespace std;
- // Перечислимый тип для статуса задачи
- enum class TaskStatus {
- NEW, // новая
- IN_PROGRESS, // в разработке
- TESTING, // на тестировании
- DONE // завершена
- };
- // Объявляем тип-синоним для map<TaskStatus, int>,
- // позволяющего хранить количество задач каждого статуса
- using TasksInfo = map<TaskStatus, uint64_t>;
- class TeamTasks {
- public:
- map<string, TasksInfo> Tasks_and_persons_;
- // Получить статистику по статусам задач конкретного разработчика
- const TasksInfo& GetPersonTasksInfo(const string& person) const
- {
- return Tasks_and_persons_.at(person);
- }
- // Добавить новую задачу (в статусе NEW) для конкретного разработчитка
- void AddNewTask(const string& person)
- {
- if (Tasks_and_persons_.count(person)==0){
- Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
- Tasks_and_persons_[person][TaskStatus::TESTING];
- Tasks_and_persons_[person][TaskStatus::DONE];
- }
- Tasks_and_persons_[person][TaskStatus::NEW]++;
- }
- // Обновить статусы по данному количеству задач конкретного разработчика,
- // подробности см. ниже
- tuple<TasksInfo, TasksInfo> PerformPersonTasks(const string& person, uint64_t task_count){
- // Проинициализировать словари, учитывающие изменяемость задач
- TasksInfo upd;
- upd[TaskStatus::NEW];
- upd[TaskStatus::IN_PROGRESS];
- upd[TaskStatus::TESTING];
- upd[TaskStatus::DONE];
- //Принять текущее состояние задач
- TasksInfo untch=GetPersonTasksInfo(person);
- tuple<TasksInfo&, TasksInfo&> upd_untch_tasks(upd,untch);
- //Цикл, продвигающий задачи из статуса в статус:
- for (uint64_t i=0; i<task_count; ++i)
- {
- if (Tasks_and_persons_[person][TaskStatus::NEW]>0)
- {
- --Tasks_and_persons_[person][TaskStatus::NEW];
- ++Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
- if (untch[TaskStatus::NEW]>0) --untch[TaskStatus::NEW];
- continue;
- }
- if ((Tasks_and_persons_[person][TaskStatus::NEW]==0)&&
- (Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]>0))
- {
- --Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
- ++Tasks_and_persons_[person][TaskStatus::TESTING];
- if (untch[TaskStatus::IN_PROGRESS]>0)--untch[TaskStatus::IN_PROGRESS];
- continue;
- }
- if ((Tasks_and_persons_[person][TaskStatus::NEW]==0)&&
- (Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]==0)&&
- (Tasks_and_persons_[person][TaskStatus::TESTING]>0))
- {
- --Tasks_and_persons_[person][TaskStatus::TESTING];
- ++Tasks_and_persons_[person][TaskStatus::DONE];
- if (untch[TaskStatus::TESTING]>0) --untch[TaskStatus::TESTING];
- continue;
- }
- }
- // конец цикла протаклкивающего задачи
- upd[TaskStatus::NEW]=Tasks_and_persons_[person][TaskStatus::NEW]-untch[TaskStatus::NEW];
- upd[TaskStatus::IN_PROGRESS]=Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]-untch[TaskStatus::IN_PROGRESS];
- upd[TaskStatus::TESTING]=Tasks_and_persons_[person][TaskStatus::TESTING]-untch[TaskStatus::TESTING];
- upd[TaskStatus::DONE]=Tasks_and_persons_[person][TaskStatus::DONE]-untch[TaskStatus::DONE];
- return upd_untch_tasks;
- }
- };
- // Принимаем словарь по значению, чтобы иметь возможность
- // обращаться к отсутствующим ключам с помощью [] и получать 0,
- // не меняя при этом исходный словарь
- void PrintTasksInfo(TasksInfo tasks_info) {
- cout << tasks_info[TaskStatus::NEW] << " new tasks" <<
- ", " << tasks_info[TaskStatus::IN_PROGRESS] << " tasks in progress" <<
- ", " << tasks_info[TaskStatus::TESTING] << " tasks are being tested" <<
- ", " << tasks_info[TaskStatus::DONE] << " tasks are done" << endl;
- }
- int main() {
- TeamTasks tasks;
- tasks.AddNewTask("Ilia");
- for (int i = 0; i < 3; ++i) {
- tasks.AddNewTask("Ivan");
- }
- cout << "Ilia's tasks: ";
- PrintTasksInfo(tasks.GetPersonTasksInfo("Ilia"));
- cout << "Ivan's tasks: ";
- PrintTasksInfo(tasks.GetPersonTasksInfo("Ivan"));
- TasksInfo updated_tasks, untouched_tasks;
- tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
- cout << "Updated Ivan's tasks: ";
- PrintTasksInfo(updated_tasks);
- cout << "Untouched Ivan's tasks: ";
- PrintTasksInfo(untouched_tasks);
- tie(updated_tasks, untouched_tasks) = tasks.PerformPersonTasks("Ivan", 2);
- cout << "Updated Ivan's tasks: ";
- PrintTasksInfo(updated_tasks);
- cout << "Untouched Ivan's tasks: ";
- PrintTasksInfo(untouched_tasks);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement