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, int task_count) {
- map<string, TasksInfo> temp_PTC = Tasks_and_persons_ ;
- map<string, TasksInfo> old_PTC = Tasks_and_persons_;
- TasksInfo updated;
- TasksInfo untouched;
- /* if (task_count > task_[person]) {
- task_count = task_[person];
- }*/
- if (Tasks_and_persons_.count(person) == 0) {
- return tuple(updated, untouched);
- }
- if (temp_PTC[person][TaskStatus::NEW]==0 &&
- temp_PTC[person][TaskStatus::IN_PROGRESS]==0 &&
- temp_PTC[person][TaskStatus::TESTING]==0
- ) { return tuple(updated, untouched);}
- for (int i=0; i < task_count; ++i) {
- if (Tasks_and_persons_[person][TaskStatus::NEW]>0) {
- --untouched[TaskStatus::NEW];
- --temp_PTC[person][TaskStatus::NEW];
- ++temp_PTC[person][TaskStatus::IN_PROGRESS];
- --Tasks_and_persons_[person][TaskStatus::NEW];
- }
- else if (Tasks_and_persons_[person][TaskStatus::IN_PROGRESS]>0) {
- --untouched[TaskStatus::IN_PROGRESS];
- --temp_PTC[person][TaskStatus::IN_PROGRESS];
- ++temp_PTC[person][TaskStatus::TESTING];
- --Tasks_and_persons_[person][TaskStatus::IN_PROGRESS];
- }
- else if (Tasks_and_persons_[person][TaskStatus::TESTING]>0) {
- --untouched[TaskStatus::TESTING];
- --temp_PTC[person][TaskStatus::TESTING];
- ++temp_PTC[person][TaskStatus::DONE];
- /* --task_[person];*/
- --Tasks_and_persons_[person][TaskStatus::TESTING];
- }
- }
- Tasks_and_persons_ = temp_PTC;
- untouched[TaskStatus::NEW]= old_PTC[person][TaskStatus::NEW] + untouched[TaskStatus::NEW];
- untouched[TaskStatus::IN_PROGRESS]= old_PTC[person][TaskStatus::IN_PROGRESS] + untouched[TaskStatus::IN_PROGRESS];
- untouched[TaskStatus::TESTING]= old_PTC[person][TaskStatus::TESTING] + untouched[TaskStatus::TESTING];
- updated[TaskStatus::IN_PROGRESS] = Tasks_and_persons_[person][TaskStatus::IN_PROGRESS] - untouched[TaskStatus::IN_PROGRESS];
- updated[TaskStatus::TESTING] = Tasks_and_persons_[person][TaskStatus::TESTING] - untouched[TaskStatus::TESTING];
- updated[TaskStatus::DONE] = temp_PTC[person][TaskStatus::DONE] - old_PTC[person][TaskStatus::DONE] ;
- return tuple(updated, untouched);
- }
- };
- // Принимаем словарь по значению, чтобы иметь возможность
- // обращаться к отсутствующим ключам с помощью [] и получать 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