Merge "Print list of modules with 'g_ana help'."
[alexxy/gromacs.git] / src / gromacs / commandline / cmdlinemodulemanager.h
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
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.
13
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.
18  *
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.
25  *
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.
28  *
29  * For more info, check our website at http://www.gromacs.org
30  */
31 /*! \file
32  * \brief
33  * Declares gmx::CommandLineModuleManager.
34  *
35  * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36  * \inpublicapi
37  * \ingroup module_commandline
38  */
39 #ifndef GMX_COMMANDLINE_CMDLINEMODULEMANAGER_H
40 #define GMX_COMMANDLINE_CMDLINEMODULEMANAGER_H
41
42 #include "../utility/common.h"
43 #include "../utility/uniqueptr.h"
44
45 namespace gmx
46 {
47
48 class CommandLineModuleInterface;
49
50 //! Smart pointer type for managing a CommandLineModuleInterface.
51 typedef gmx_unique_ptr<CommandLineModuleInterface>::type
52         CommandLineModulePointer;
53
54 namespace internal
55 {
56 class CommandLineHelpModule;
57 }
58
59 /*! \brief
60  * Implements a wrapper command-line interface for multiple modules.
61  *
62  * Typical usage:
63  * \code
64 int
65 main(int argc, char *argv[])
66 {
67     CopyRight(stderr, argv[0]);
68     try
69     {
70         gmx::CommandLineModuleManager manager;
71         // <register all necessary modules>
72         return manager.run(argc, argv);
73     }
74     catch (const std::exception &ex)
75     {
76         fprintf(stderr, "%s", gmx::formatErrorMessage(ex).c_str());
77         return 1;
78     }
79 }
80  * \endcode
81  *
82  * \inpublicapi
83  * \ingroup module_commandline
84  */
85 class CommandLineModuleManager
86 {
87     public:
88         CommandLineModuleManager();
89         ~CommandLineModuleManager();
90
91         /*! \brief
92          * Adds a given module to this manager.
93          *
94          * \param   module  Module to add.
95          * \throws  std::bad_alloc if out of memory.
96          *
97          * The manager takes ownership of the object.
98          *
99          * This method is public mostly for testing purposes; for typical uses,
100          * registerModule() is a more convenient way of adding modules.
101          *
102          * \see registerModule()
103          */
104         void addModule(CommandLineModulePointer module);
105         /*! \brief
106          * Registers a module of a certain type to this manager.
107          *
108          * \tparam  Module  Type of module to register.
109          * \throws  std::bad_alloc if out of memory.
110          *
111          * \p Module must be default-constructible and implement
112          * CommandLineModuleInterface.
113          *
114          * This method is provided as a convenient alternative to addModule()
115          * for cases where each module is implemented by a different type
116          * (which should be the case for typical situations outside unit
117          * tests).
118          */
119         template <class Module>
120         void registerModule()
121         {
122             addModule(CommandLineModulePointer(new Module));
123         }
124
125         /*! \brief
126          * Runs a module based on given command line.
127          *
128          * \param[in] argc  Number of elements in \p argv.
129          * \param[in] argv  Command-line arguments.
130          * \throws   unspecified  Throws any exception that the selected module
131          *      throws.
132          * \returns  Exit code for the program.
133          * \retval   0 on successful termination.
134          * \retval   2 if no module is specified, or if the module is not found.
135          *
136          * Runs the module whose name matches \p argv[1].
137          */
138         int run(int argc, char *argv[]);
139
140     private:
141         class Impl;
142
143         PrivateImplPointer<Impl> impl_;
144
145         /*! \brief
146          * Needed to access information about registered modules etc.
147          */
148         friend class internal::CommandLineHelpModule;
149 };
150
151 } // namespace gmx
152
153 #endif