3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
33 * Declares gmx::CommandLineModuleManager.
35 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
37 * \ingroup module_commandline
39 #ifndef GMX_COMMANDLINE_CMDLINEMODULEMANAGER_H
40 #define GMX_COMMANDLINE_CMDLINEMODULEMANAGER_H
42 #include "../onlinehelp/helptopicinterface.h"
43 #include "../utility/common.h"
44 #include "../utility/uniqueptr.h"
49 class CommandLineModuleInterface;
52 //! Smart pointer type for managing a CommandLineModuleInterface.
53 typedef gmx_unique_ptr<CommandLineModuleInterface>::type
54 CommandLineModulePointer;
57 * Implements a wrapper command-line interface for multiple modules.
62 main(int argc, char *argv[])
64 const gmx::ProgramInfo &programInfo =
65 gmx::ProgramInfo::init("g_ana", argc, argv);
66 CopyRight(stderr, argv[0]);
69 gmx::CommandLineModuleManager manager(programInfo);
70 // <register all necessary modules>
71 return manager.run(argc, argv);
73 catch (const std::exception &ex)
75 fprintf(stderr, "%s", gmx::formatErrorMessage(ex).c_str());
82 * \ingroup module_commandline
84 class CommandLineModuleManager
88 * Initializes a command-line module manager.
90 * \param[in] programInfo Program information for the running binary.
91 * \throws std::bad_alloc if out of memory.
93 * The binary name is used to detect when the binary is run through a
94 * symlink, and automatically invoke a matching module in such a case.
96 explicit CommandLineModuleManager(const ProgramInfo &programInfo);
97 ~CommandLineModuleManager();
100 * Adds a given module to this manager.
102 * \param module Module to add.
103 * \throws std::bad_alloc if out of memory.
105 * The manager takes ownership of the object.
107 * This method is public mostly for testing purposes; for typical uses,
108 * registerModule() is a more convenient way of adding modules.
110 * \see registerModule()
112 void addModule(CommandLineModulePointer module);
114 * Registers a module of a certain type to this manager.
116 * \tparam Module Type of module to register.
117 * \throws std::bad_alloc if out of memory.
119 * \p Module must be default-constructible and implement
120 * CommandLineModuleInterface.
122 * This method is provided as a convenient alternative to addModule()
123 * for cases where each module is implemented by a different type
124 * (which should be the case for typical situations outside unit
127 template <class Module>
128 void registerModule()
130 addModule(CommandLineModulePointer(new Module));
134 * Make given help topic available through the manager's help module.
136 * \param[in] topic Help topic to add.
137 * \throws std::bad_alloc if out of memory.
139 * The manager takes ownership of the help topic.
141 void addHelpTopic(HelpTopicPointer topic);
144 * Runs a module based on given command line.
146 * \param[in] argc Number of elements in \p argv.
147 * \param[in] argv Command-line arguments.
148 * \throws unspecified Throws any exception that the selected module
150 * \returns Exit code for the program.
151 * \retval 0 on successful termination.
152 * \retval 2 if no module is specified, or if the module is not found.
154 * Runs the module whose name matches \p argv[1].
156 int run(int argc, char *argv[]);
161 PrivateImplPointer<Impl> impl_;