{"id":20408202,"url":"https://github.com/hashlag/scheduler","last_synced_at":"2025-08-25T21:06:11.681Z","repository":{"id":242424761,"uuid":"809389485","full_name":"hashlag/scheduler","owner":"hashlag","description":"Класс, управляющий ленивым вычислением связанных между собой задач.","archived":false,"fork":false,"pushed_at":"2024-06-02T21:13:49.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-15T13:06:37.539Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hashlag.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-02T14:57:25.000Z","updated_at":"2024-06-02T21:17:10.000Z","dependencies_parsed_at":"2024-06-02T23:41:39.283Z","dependency_job_id":null,"html_url":"https://github.com/hashlag/scheduler","commit_stats":null,"previous_names":["hashlag/scheduler"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hashlag%2Fscheduler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hashlag%2Fscheduler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hashlag%2Fscheduler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hashlag%2Fscheduler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hashlag","download_url":"https://codeload.github.com/hashlag/scheduler/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241952979,"owners_count":20048108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T05:29:20.914Z","updated_at":"2025-03-05T02:29:06.712Z","avatar_url":"https://github.com/hashlag.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Планировщик\n\n## Описание\n\nКласс `Scheduler`, управляющий ленивым вычислением связанных между собой задач. Задачи могут зависеть друг от друга, и будущий результат выполнения одной задачи может быть использован в качестве параметра для другой.\n\n## Пример использования\n\nРассмотрим пример нахождения корней квадратного уравнения:\n\n```c++\nfloat a = 1;\nfloat b = -2;\nfloat c = 0;\n\nsched::Scheduler scheduler;\n\nauto id1 = scheduler.add([](float a, float c){return -4 * a * c;}, a, c);\nauto id2 = scheduler.add([](float b, float v){return b * b + v;}, b, scheduler.get_future_result\u003cfloat\u003e(id1));\nauto id3 = scheduler.add([](float b, float d){return -b + std::sqrt(d);}, b, scheduler.get_future_result\u003cfloat\u003e(id2));\nauto id4 = scheduler.add([](float b, float d){return -b - std::sqrt(d);}, b, scheduler.get_future_result\u003cfloat\u003e(id2));\nauto id5 = scheduler.add([](float a, float v){return v/(2*a);}, a, scheduler.get_future_result\u003cfloat\u003e(id3));\nauto id6 = scheduler.add([](float a, float v){return v/(2*a);},a, scheduler.get_future_result\u003cfloat\u003e(id4));\n\nscheduler.execute_all();\n\nstd::cout \u003c\u003c \"x1 = \" \u003c\u003c scheduler.get_result\u003cfloat\u003e(id5) \u003c\u003c std::endl;\nstd::cout \u003c\u003c \"x2 = \" \u003c\u003c scheduler.get_result\u003cfloat\u003e(id6) \u003c\u003c std::endl;\n```\n\n## Публичный интерфейс `Scheduler`\n\n### `add()`\n\n```c++\ntemplate \u003ctypename Fn, typename... Args\u003e\nTaskId add(Fn\u0026\u0026 fn, Args\u0026\u0026... args);\n```\n\nДобавляет задачу в планировщик.\n\n### Параметры\n\n| Имя    | Тип                | Описание                                    |\n|--------|--------------------|---------------------------------------------|\n| `fn`   | `typename Fn`      | Функция, для выполнения в качестве задачи.  |\n| `args` | `typename... Args` | Аргументы для передачи в `fn`.              |\n\n### Возвращаемое значение\n\nИдентификатор задачи типа `TaskId`.   \n\n### `get_future_result()`\n\n```c++\ntemplate \u003ctypename ReturnType\u003e\nFutureResult\u003cReturnType\u003e get_future_result(TaskId id);\n```\n\nВозвращает объект соответствующий будущему результату выполнения задачи.\nИспользуется для передачи в другую задачу ещё не подсчитанного результата выполнения данной.\n\n### Параметры\n\n| Имя    | Тип      | Описание              |\n|--------|----------|-----------------------|\n| `id`   | `TaskId` | Идентификатор задачи. |\n\n### Возвращаемое значение\n\nОбъект типа `FutureResult\u003cReturnType\u003e`.   \n\n### `get_result()`\n\n```c++\ntemplate \u003ctypename ReturnType\u003e\nReturnType\u0026 get_result(TaskId id);\n```\n\nВозвращает результат выполнения задачи типа `ReturnType`, вычисляет его, если он еще не был подсчитан.\n\n### Параметры\n\n| Имя    | Тип      | Описание              |\n|--------|----------|-----------------------|\n| `id`   | `TaskId` | Идентификатор задачи. |\n\n### Возвращаемое значение\n\nСсылка на результат выполнения задачи.   \n\n### `execute_all()`\n\n```c++\nvoid execute_all();\n```\n\nВыполняет все запланированные задачи.   \n\n### `remove()`\n\n```c++\nvoid remove(TaskId id);\n```\n\nУдаляет задачу из планировщика.   \n\n### Параметры\n\n| Имя    | Тип      | Описание              |\n|--------|----------|-----------------------|\n| `id`   | `TaskId` | Идентификатор задачи. |\n\n## Требования и ограничения\n\n- Задачи должны быть [Callable objects](https://en.cppreference.com/w/cpp/named_req/Callable) (возможно, move-only).\n- Возвращаемое значение [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible).\n- Аргументы могут быть move-only.\n\n## Тестирование\n\nКод покрыт unit-тестами при помощи [gtest](https://github.com/google/googletest).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhashlag%2Fscheduler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhashlag%2Fscheduler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhashlag%2Fscheduler/lists"}