1111#ifndef FRAMEWORK_RUN_DATA_PROCESSING_H
1212#define FRAMEWORK_RUN_DATA_PROCESSING_H
1313
14+ #include < fmt/format.h>
1415#include " Framework/ChannelConfigurationPolicy.h"
1516#include " Framework/CallbacksPolicy.h"
1617#include " Framework/CompletionPolicy.h"
3031#include " Framework/CheckTypes.h"
3132#include " Framework/StructToTuple.h"
3233#include " Framework/ConfigParamDiscovery.h"
34+ #include " ResourcePolicy.h"
3335#include " ServiceRegistryRef.h"
3436#include < vector>
3537
@@ -66,9 +68,7 @@ o2::framework::WorkflowSpec defineDataProcessing(o2::framework::ConfigContext co
6668
6769// By default we leave the channel policies unchanged. Notice that the default still include
6870// a "match all" policy which uses pub / sub
69- // FIXME: add a debug statement saying that the default policy was used?
7071
71- void defaultConfiguration (std::vector<o2::framework::ChannelConfigurationPolicy>& channelPolicies) {}
7272void defaultConfiguration (std::vector<o2::framework::ConfigParamSpec>& globalWorkflowOptions)
7373{
7474 o2::framework::call_if_defined<struct WorkflowOptions >([&](auto * ptr) {
@@ -80,19 +80,13 @@ void defaultConfiguration(std::vector<o2::framework::ConfigParamSpec>& globalWor
8080 });
8181}
8282
83- void defaultConfiguration (std::vector<o2::framework::CompletionPolicy>& completionPolicies) {}
84- void defaultConfiguration (std::vector<o2::framework::DispatchPolicy>& dispatchPolicies) {}
85- void defaultConfiguration (std::vector<o2::framework::ResourcePolicy>& resourcePolicies) {}
8683void defaultConfiguration (std::vector<o2::framework::ServiceSpec>& services)
8784{
8885 if (services.empty ()) {
8986 services = o2::framework::CommonServices::defaultServices ();
9087 }
9188}
9289
93- void defaultConfiguration (std::vector<o2::framework::CallbacksPolicy>& callbacksPolicies) {}
94- void defaultConfiguration (std::vector<o2::framework::SendingPolicy>& callbacksPolicies) {}
95-
9690// / Workflow options which are required by DPL in order to work.
9791std::vector<o2::framework::ConfigParamSpec> requiredWorkflowOptions ();
9892
@@ -101,19 +95,26 @@ void defaultConfiguration(o2::framework::OnWorkflowTerminationHook& hook)
10195 hook = [](const char *) {};
10296}
10397
98+ template <typename T>
99+ concept WithUserOverride = requires (T& something) { customize (something); };
100+
101+ template <typename T>
102+ concept WithNonTrivialDefault = !WithUserOverride<T> && requires (T& something) { defaultConfiguration (something); };
103+
104104struct UserCustomizationsHelper {
105- template <typename T>
106- static auto userDefinedCustomization (T& something, int preferUser) -> decltype(customize(something), void())
105+ static auto userDefinedCustomization (WithUserOverride auto & something) -> void
107106 {
108107 customize (something);
109108 }
110109
111- template <typename T>
112- static auto userDefinedCustomization (T& something, long preferUser)
113- -> decltype(defaultConfiguration(something), void())
110+ static auto userDefinedCustomization (WithNonTrivialDefault auto & something) -> void
114111 {
115112 defaultConfiguration (something);
116113 }
114+
115+ static auto userDefinedCustomization (auto &) -> void
116+ {
117+ }
117118};
118119
119120namespace o2 ::framework
@@ -144,12 +145,14 @@ int doMain(int argc, char** argv, o2::framework::WorkflowSpec const& specs,
144145void doDefaultWorkflowTerminationHook ();
145146
146147template <typename T>
148+ requires requires (T& policy) { { T::createDefaultPolicies () } -> std::same_as<std::vector<T>>; }
147149std::vector<T> injectCustomizations ()
148150{
149151 std::vector<T> policies;
150- UserCustomizationsHelper::userDefinedCustomization (policies, 0 );
152+ UserCustomizationsHelper::userDefinedCustomization (policies);
151153 auto defaultPolicies = T::createDefaultPolicies ();
152- policies.insert (std::end (policies), std::begin (policies), std::end (policies));
154+ policies.insert (std::end (policies), std::begin (defaultPolicies), std::end (defaultPolicies));
155+ return policies;
153156}
154157
155158int mainNoCatch (int argc, char ** argv)
@@ -158,34 +161,15 @@ int mainNoCatch(int argc, char** argv)
158161 using namespace boost ::program_options;
159162
160163 std::vector<o2::framework::ConfigParamSpec> workflowOptions;
161- UserCustomizationsHelper::userDefinedCustomization (workflowOptions, 0 );
164+ UserCustomizationsHelper::userDefinedCustomization (workflowOptions);
162165 auto requiredWorkflowOptions = WorkflowCustomizationHelpers::requiredWorkflowOptions ();
163166 workflowOptions.insert (std::end (workflowOptions), std::begin (requiredWorkflowOptions), std::end (requiredWorkflowOptions));
164167
165- std::vector<CompletionPolicy> completionPolicies;
166- UserCustomizationsHelper::userDefinedCustomization (completionPolicies, 0 );
167- auto defaultCompletionPolicies = CompletionPolicy::createDefaultPolicies ();
168- completionPolicies.insert (std::end (completionPolicies), std::begin (defaultCompletionPolicies), std::end (defaultCompletionPolicies));
169-
170- std::vector<DispatchPolicy> dispatchPolicies;
171- UserCustomizationsHelper::userDefinedCustomization (dispatchPolicies, 0 );
172- auto defaultDispatchPolicies = DispatchPolicy::createDefaultPolicies ();
173- dispatchPolicies.insert (std::end (dispatchPolicies), std::begin (defaultDispatchPolicies), std::end (defaultDispatchPolicies));
174-
175- std::vector<ResourcePolicy> resourcePolicies;
176- UserCustomizationsHelper::userDefinedCustomization (resourcePolicies, 0 );
177- auto defaultResourcePolicies = ResourcePolicy::createDefaultPolicies ();
178- resourcePolicies.insert (std::end (resourcePolicies), std::begin (defaultResourcePolicies), std::end (defaultResourcePolicies));
179-
180- std::vector<CallbacksPolicy> callbacksPolicies;
181- UserCustomizationsHelper::userDefinedCustomization (callbacksPolicies, 0 );
182- auto defaultCallbacksPolicies = CallbacksPolicy::createDefaultPolicies ();
183- callbacksPolicies.insert (std::end (callbacksPolicies), std::begin (defaultCallbacksPolicies), std::end (defaultCallbacksPolicies));
184-
185- std::vector<SendingPolicy> sendingPolicies;
186- UserCustomizationsHelper::userDefinedCustomization (sendingPolicies, 0 );
187- auto defaultSendingPolicies = SendingPolicy::createDefaultPolicies ();
188- sendingPolicies.insert (std::end (sendingPolicies), std::begin (defaultSendingPolicies), std::end (defaultSendingPolicies));
168+ std::vector<CompletionPolicy> completionPolicies = injectCustomizations<CompletionPolicy>();
169+ std::vector<DispatchPolicy> dispatchPolicies = injectCustomizations<DispatchPolicy>();
170+ std::vector<ResourcePolicy> resourcePolicies = injectCustomizations<ResourcePolicy>();
171+ std::vector<CallbacksPolicy> callbacksPolicies = injectCustomizations<CallbacksPolicy>();
172+ std::vector<SendingPolicy> sendingPolicies = injectCustomizations<SendingPolicy>();
189173
190174 std::vector<std::unique_ptr<ParamRetriever>> retrievers;
191175 std::unique_ptr<ParamRetriever> retriever{new BoostOptionsRetriever (true , argc, argv)};
@@ -206,10 +190,10 @@ int mainNoCatch(int argc, char** argv)
206190 overridePipeline (configContext, specs);
207191 overrideLabels (configContext, specs);
208192 for (auto & spec : specs) {
209- UserCustomizationsHelper::userDefinedCustomization (spec.requiredServices , 0 );
193+ UserCustomizationsHelper::userDefinedCustomization (spec.requiredServices );
210194 }
211195 std::vector<ChannelConfigurationPolicy> channelPolicies;
212- UserCustomizationsHelper::userDefinedCustomization (channelPolicies, 0 );
196+ UserCustomizationsHelper::userDefinedCustomization (channelPolicies);
213197 auto defaultChannelPolicies = ChannelConfigurationPolicy::createDefaultPolicies (configContext);
214198 channelPolicies.insert (std::end (channelPolicies), std::begin (defaultChannelPolicies), std::end (defaultChannelPolicies));
215199 return doMain (argc, argv, specs,
@@ -229,7 +213,7 @@ int main(int argc, char** argv)
229213
230214 char * idstring = getIdString (argc, argv);
231215 o2::framework::OnWorkflowTerminationHook onWorkflowTerminationHook;
232- UserCustomizationsHelper::userDefinedCustomization (onWorkflowTerminationHook, 0 );
216+ UserCustomizationsHelper::userDefinedCustomization (onWorkflowTerminationHook);
233217 onWorkflowTerminationHook (idstring);
234218 doDefaultWorkflowTerminationHook ();
235219
0 commit comments