Build an association map, i.e., a map that associates a decider/trigger name with a collection of tasknames.
The Association Map is built from a map that associates names to tasks, a map that associates names and deciders/triggers, and a map or vector of pairs that associates each taskname with the name of a trigger/decider functor. If this last argument is not given, then a bijective association is attempted in which each task is associated with a trigger/decider that correponds to its position in the "named_dts" argument. This means that "tasks" and "named_dts" needs to be of equal length. If this is violated the function throws. If the "assocs" argument is given, the requirement of equal length is not necessary, because it specifies this bijective mapping. Note that this means that the "assocs" argument maps one decider/triggername to a taskname, and tasknames may repeat, while decider/triggernames do not.
- Template Parameters
-
AssocsMap | Final map that maps names of deciders/triggers to a collection of task names |
NamedTasks | automatically determined |
NamedDTMap | automatically determined |
Assocs | automatically determined |
- Parameters
-
tasks | map or vector of pairs containing (name, task). |
named_dts | map or vector of pairs containing (name, decider/trigger) |
assocs | map or vector of pairs containing (taskname, decider-/triggername). |
- Returns
- AssocsMap Map that maps a name of a decider/trigger to a vector of tasknames. This argument is optional: If it is not given, then the function will try to associate tasks and deciders/triggers one by one in a bijective way in the order given. If that fails, an error is thrown.
151 {})
152{
153
154 AssocsMap map;
155
156
157
158
159
160 if (tasks.size() != named_dts.size())
161 {
162 if (assocs.size() == 0)
163 {
164 throw std::invalid_argument(
165 "Error, explicit associations have to be given when mapping "
166 "unequal numbers of decider or trigger functions and tasks.");
167 }
168 else
169 {
170 for (auto&& [taskname, dt_name] : assocs)
171 {
172 map[dt_name].push_back(taskname);
173 }
174 }
175 }
176 else
177 {
178
179 for (auto&& [namedtask, namedhelper] : Itertools::zip(tasks, named_dts))
180 {
181 map[namedhelper.first].push_back(namedtask.first);
182 }
183 }
184
185 return map;
186}