Loading...
Searching...
No Matches
JobRegistry.cpp
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5*/
6#include "eon/JobRegistry.h"
7
8#include <map>
9#include <memory>
10#include <stdexcept>
11
12namespace eonc {
13
14std::map<JobType, JobFactory> &jobTable() {
15 static std::map<JobType, JobFactory> t;
16 return t;
17}
18
19void registerJob(JobType type, JobFactory factory) {
20 jobTable()[type] = std::move(factory);
21}
22
23} // namespace eonc
24
25namespace eonc::helpers {
26
27namespace {
28
29std::unique_ptr<Job> makeJobFromFactory(std::unique_ptr<Parameters> params,
30 Runtime &runtime) {
32 const JobType type = params->main_options().job;
33 auto &t = eonc::jobTable();
34 auto it = t.find(type);
35 if (it == t.end()) {
36 throw std::runtime_error("No known job could be constructed");
37 }
38 return it->second(std::move(params), runtime);
39}
40
41} // namespace
42
43std::unique_ptr<Job> makeJob(std::unique_ptr<Parameters> params,
44 Runtime &runtime) {
45 return makeJobFromFactory(std::move(params), runtime);
46}
47
48std::unique_ptr<Job> makeJob(std::unique_ptr<Parameters> params,
49 std::unique_ptr<Runtime> runtime) {
50 if (!runtime) {
51 throw std::logic_error("makeJob: null Runtime");
52 }
53 Runtime &ref = *runtime;
54 auto job = makeJobFromFactory(std::move(params), ref);
55 job->adoptRuntime(std::move(runtime));
56 return job;
57}
58
59std::unique_ptr<Job> makeJob(std::unique_ptr<Parameters> params,
60 Runtime &&runtime) {
61 return makeJob(std::move(params),
62 std::make_unique<Runtime>(std::move(runtime)));
63}
64
65std::unique_ptr<Job> makeJob(std::unique_ptr<Parameters> params) {
66 return makeJob(std::move(params), std::make_unique<Runtime>());
67}
68
69} // namespace eonc::helpers
Move-only composition root for process resources (dlopen loaders and the potential registry).
Definition Runtime.h:27
std::unique_ptr< Job > makeJob(std::unique_ptr< Parameters > params, Runtime &runtime)
Borrow: caller keeps Runtime alive.
RAII resource manager for the ARTn C library with global synchronization.
std::map< JobType, JobFactory > & jobTable()
void forceJobRegistration()
Definition Job.cpp:41
std::function< std::unique_ptr< Job >(std::unique_ptr< Parameters >, Runtime &)> JobFactory
Definition JobRegistry.h:16
void registerJob(JobType type, JobFactory factory)