/******************************************************************************** * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence version 3 (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #include #include "FairMQLogger.h" #include "options/FairMQProgOptions.h" #include "FairMQDevice.h" #include "tools/runSimpleMQStateMachine.h" template class GenericFairMQDevice : public FairMQDevice { public: GenericFairMQDevice(R func) : r(func) {} protected: virtual bool ConditionalRun() { return r(*static_cast(this)); } private: R r; }; template FairMQDevice* makeDeviceWithConditionalRun(R r) { return new GenericFairMQDevice(r); } using FairMQDevicePtr = FairMQDevice*; // to be implemented by the user to return a child class of FairMQDevice FairMQDevicePtr getDevice(const FairMQProgOptions& config); // to be implemented by the user to add custom command line options (or just with empty body) void addCustomOptions(boost::program_options::options_description&); int main(int argc, char** argv) { try { boost::program_options::options_description customOptions("Custom options"); addCustomOptions(customOptions); FairMQProgOptions config; config.AddToCmdLineOptions(customOptions); config.ParseAll(argc, argv); std::unique_ptr device(getDevice(config)); if (!device) { LOG(ERROR) << "getDevice(): no valid device provided. Exiting."; return 1; } int result = runStateMachine(*device, config); if (result > 0) { return 1; } } catch (std::exception& e) { LOG(ERROR) << "Unhandled exception reached the top of main: " << e.what() << ", application will now exit"; return 1; } return 0; }