Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- #include <tuple>
- #include <algorithm>
- using namespace std;
- /// Перечислимый тип для статуса задачи
- enum class TaskStatus {
- NEW, // новая
- IN_PROGRESS, // в разработке
- TESTING, // на тестировании
- DONE // завершена
- };
- /*
- bool operator <(const TaskStatus& lhs, const TaskStatus& rhs){
- return tie(lhs) < tie(rhs);
- }
- */
- /// Объявляем тип-синоним для map<TaskStatus, int>,
- /// позволяющего хранить количество задач каждого статуса
- using TasksInfo = map<TaskStatus, int>;
- map<string, TasksInfo> PersonTasks;
- class TeamTasks {
- public:
- /// Получить статистику по статусам задач конкретного разработчика
- const TasksInfo& GetPersonTasksInfo(const string& person) const{
- return (PersonTasks[person]);
- }
- /// Добавить новую задачу (в статусе NEW) для конкретного разработчитка
- void AddNewTask(const string& person){
- PersonTasks[person][TaskStatus::NEW]++;
- }
- /// Обновить статусы по данному количеству задач конкретного разработчика,
- /// подробности см. ниже
- tuple<TasksInfo, TasksInfo> PerformPersonTasks(
- const string& person, int task_count){
- auto tmp = PersonTasks[person];
- vector<int> v(4);
- /*
- {PersonTasks[person].at(TaskStatus::NEW),
- PersonTasks[person].at(TaskStatus::IN_PROGRESS),PersonTasks[person][TaskStatus::TESTING],
- PersonTasks[person][TaskStatus::DONE]
- */
- v[0] = tmp[TaskStatus::NEW];
- v[1] = tmp[TaskStatus::IN_PROGRESS];
- v[2] = tmp[TaskStatus::TESTING];
- v[3] = tmp[TaskStatus::DONE];
- TasksInfo done, undone;
- vector<int> v2(v);
- while(task_count){
- while (v[0]-- && task_count){
- done[TaskStatus::IN_PROGRESS]++;
- task_count--;
- //if(task_count==0) break;
- }
- while (v[1]-- && task_count){
- done[TaskStatus::TESTING]++;
- task_count--;
- }
- while (v[2]-- && task_count){
- done[TaskStatus::DONE]++;
- task_count--;
- }
- while (v[3]-- && task_count){
- task_count--;
- }
- }
- int i;
- for(i = 0; i<v.size(); ++i){
- if(v[i]){
- v2[i]=fabs(v[i]-v2[i]);
- break;
- }
- else
- v2[i]=0;
- }
- for(auto j: v2)
- cout<<j<<' ';
- if(v2[0]){
- undone[TaskStatus::NEW] = v2[0];
- }
- if(v2[1]){
- undone[TaskStatus::IN_PROGRESS] = v2[1];
- }
- if(v2[2]){
- undone[TaskStatus::TESTING] = v2[2];
- }
- // cout<<get<0>(t)<<' ' <<get<1>(t)<<' '<<get<2>(t)<<' '<<get<3>(t);
- PersonTasks[person] = done;
- return (tie(done, undone));
- }
- };
- // Принимаем словарь по значению, чтобы иметь возможность
- // обращаться к отсутствующим ключам с помощью [] и получать 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);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement