source: src/Actions/Action_impl_pre.hpp@ 0c8056

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 0c8056 was 0c8056, checked in by Frederik Heber <heber@…>, 11 years ago

Actions now get ptr to ActionRegistry in cstor.

  • this is the last of the externally present getActionRegistry() calls.
  • also changed: Calculation, ErrorAction, ManipulateAtomsProcess, MakroAction, MethodAction, Process, Reaction. Some of these had default of doRegister but are only used with false. We removed any default value in header if set to true. However, this will cause default behavior of false (as Action has default NULL for ActionRegistry ptr).
  • purged some unnecessary ActionRegistry includes.
  • Property mode set to 100644
File size: 11.2 KB
Line 
1/*
2 * Action_impl.hpp
3 *
4 * Created on: Aug 25, 2010
5 * Author: heber
6 */
7
8/** These macros define the following functions, necessary but repetitive for
9 * every Action:
10 * -# Dialog* fillDialog()
11 * -# action command (e.g. AnalysisMolecularVolume() )
12 * -# void getParametersfromValuStorage()
13 * -# struct Action...Parameters
14 *
15 * For this, the user has the define the following values, each with
16 * parenthesis, for the values/parameters the action needs
17 * -# paramtypes, e.g. (int)(double)
18 * -# paramtokens, e.g. ("Z")("length")
19 * -# paramreferences, e.g. (Z)(length)
20 * and for additional values/parameters to save in the state
21 * -# statetypes, e.g. (int)(double)
22 * -# statereferences, e.g. (Z)(length)
23 * and the name and category of the action
24 * -# CATEGORY, e.g. Analysis
25 * -# ACTIONNAME, e.g. MolecularVolume
26 */
27
28// include config.h
29#ifdef HAVE_CONFIG_H
30#include <config.h>
31#endif
32
33#include "CodePatterns/Chronos.hpp"
34
35#include <boost/preprocessor/cat.hpp>
36#include <boost/preprocessor/expand.hpp>
37#include <boost/preprocessor/comparison/equal.hpp>
38#include <boost/preprocessor/comparison/not_equal.hpp>
39#include <boost/preprocessor/control/expr_if.hpp>
40#include <boost/preprocessor/control/if.hpp>
41#include <boost/preprocessor/debug/assert.hpp>
42#include <boost/preprocessor/iteration/local.hpp>
43#include <boost/preprocessor/list/adt.hpp>
44#include <boost/preprocessor/punctuation/comma_if.hpp>
45#include <boost/preprocessor/repetition/repeat.hpp>
46#include <boost/preprocessor/seq/elem.hpp>
47#include <boost/preprocessor/seq/push_back.hpp>
48#include <boost/preprocessor/seq/seq.hpp>
49#include <boost/preprocessor/seq/size.hpp>
50#include <boost/preprocessor/seq/transform.hpp>
51
52#include "Actions/ActionQueue.hpp"
53#include "Parameters/Parameter.hpp"
54
55
56// some derived names: if CATEGORY is not given, we don't prefix with it
57#ifdef CATEGORY
58#define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
59#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
60#define STATE BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, State))
61#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
62#else
63#define ACTION BOOST_PP_CAT(ACTIONNAME, Action)
64#define COMMAND ACTIONNAME
65#define STATE BOOST_PP_CAT(ACTIONNAME, State)
66#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
67#endif
68#define INSTANCE BOOST_PP_CAT(this_, BOOST_PP_CAT(ACTIONNAME, _instance))
69
70// check if no lists given
71#ifndef paramtypes
72#define MAXPARAMTYPES 0
73#else
74#define MAXPARAMTYPES BOOST_PP_SEQ_SIZE(paramtypes)
75#endif
76#ifndef statetypes
77#define MAXSTATETYPES 0
78#else
79#define MAXSTATETYPES BOOST_PP_SEQ_SIZE(statetypes)
80#endif
81#ifndef paramdefaults
82#define MAXPARAMDEFAULTS 0
83// this is required for valid_print "else part"
84#define sequencer(z,n,data) \
85 BOOST_PP_SEQ_PUSH_BACK( data, NOPARAM_DEFAULT)
86#define paramdefaults BOOST_PP_REPEAT( MAXPARAMTYPES, sequencer, BOOST_PP_SEQ_NIL )
87#else
88#define MAXPARAMDEFAULTS BOOST_PP_SEQ_SIZE(paramdefaults)
89#endif
90#define PARAM_DEFAULT(x) \
91 (x, BOOST_PP_NIL)
92
93// check user has given name and category
94#ifndef ACTIONNAME
95ERROR: No "ACTIONNAME" defined in: __FILE__
96#endif
97
98// calculate numbers and check whether all have same size
99#ifdef paramtokens
100BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramtokens)),\
101 ERROR: There are not the same number of "paramtokens" and "paramtypes" in: __FILE__ \
102)
103#endif
104#ifdef paramreferences
105BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\
106 ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \
107)
108#endif
109
110#ifdef statetypes
111BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXSTATETYPES, BOOST_PP_SEQ_SIZE(statereferences)),\
112 ERROR: There are not the same number of "statetypes" and "statereferences" in: __FILE__ \
113)
114#endif
115
116// print a list of type ref followed by a separator, i.e. "int i;"
117#define initialiser_print(z,n,initialiserlist) \
118 BOOST_PP_SEQ_ELEM(n, initialiserlist) \
119 (BOOST_PP_CAT(_, BOOST_PP_SEQ_ELEM(n, initialiserlist))),
120
121// print a list of ref(_ref) followed by a separator, i.e. "id(_id),"
122#define type_print(z,n,TYPELIST, VARLIST, separator) \
123 BOOST_PP_SEQ_ELEM(n, TYPELIST) \
124 BOOST_PP_SEQ_ELEM(n, VARLIST)\
125 separator
126
127// print a list of type ref followed, i.e. "int i, double position"
128#define type_list(z,n,TYPELIST,VARLIST) \
129 BOOST_PP_COMMA_IF(n)\
130 BOOST_PP_SEQ_ELEM(n, TYPELIST) \
131 BOOST_PP_SEQ_ELEM(n, VARLIST)
132
133// prints dialog->query calls for paramtypes with tokens
134#define dialog_print(z,n,unused) \
135 dialog->query<\
136 BOOST_PP_SEQ_ELEM(n, paramtypes)\
137 >( params. \
138 BOOST_PP_SEQ_ELEM(n, paramreferences)\
139 ,\
140 BOOST_PP_SEQ_ELEM(n, paramtokens)\
141 , Traits.getDescription()\
142 );
143
144// print an initialiser list, i.e. "var( token, valid (,default) )(,)"
145#define valid_print(z,n,TOKENLIST, VARLIST, VALIDLIST, DEFAULTLIST) \
146 BOOST_PP_COMMA_IF(n) \
147 BOOST_PP_SEQ_ELEM(n, VARLIST) \
148 ( \
149 BOOST_PP_SEQ_ELEM(n, TOKENLIST) \
150 , \
151 BOOST_PP_SEQ_ELEM(n, VALIDLIST) \
152 BOOST_PP_COMMA_IF( BOOST_PP_NOT( BOOST_PP_LIST_IS_NIL( BOOST_PP_SEQ_ELEM(n, DEFAULTLIST) ) ) ) \
153 BOOST_PP_EXPR_IF( \
154 BOOST_PP_NOT( BOOST_PP_LIST_IS_NIL( BOOST_PP_SEQ_ELEM(n, DEFAULTLIST) ) ), \
155 BOOST_PP_LIST_FIRST( BOOST_PP_SEQ_ELEM(n, DEFAULTLIST) )) \
156 )
157
158// print an initialiser list, i.e. "var( valid . var )(,)"
159#define validcopy_print(z,n,TOKENLIST, VARLIST, VALID) \
160 BOOST_PP_COMMA_IF(n) \
161 BOOST_PP_SEQ_ELEM(n, VARLIST) \
162 ( \
163 VALID . \
164 BOOST_PP_SEQ_ELEM(n, VARLIST) \
165 )
166
167// prints set/queryCurrentValue (command) for paramreferences and paramtokens
168#define value_print(z, n, container, prefix) \
169 prefix \
170 BOOST_PP_SEQ_ELEM(n, container)\
171 .set(\
172 BOOST_PP_SEQ_ELEM(n, container)\
173 );
174
175// prints set/queryCurrentValue (command) for paramreferences and paramtokens
176#define valuetype_print(z,n,container, types, prefix) \
177 prefix \
178 BOOST_PP_SEQ_ELEM(n, container) \
179 .setAsString( \
180 BOOST_PP_SEQ_ELEM(n, container) \
181 );
182
183#define stringtype std::string
184
185#define type2string(s, data, elem) \
186 stringtype
187
188
189//#include "Actions/ActionTraits.hpp"
190#include "UIElements/Dialog.hpp"
191
192#ifdef paramtokens
193#define statenecessary 1
194#endif
195#ifndef statetokens
196#define statenecessary 1
197#endif
198
199namespace MoleCuilder {
200
201// =========== memento to remember the state when undoing ===========
202#ifdef statenecessary
203class STATE : public ActionState {
204public:
205 STATE(
206#if defined statetypes && defined statereferences // if we have parameters, we have to add "_" before each reference and add the params as the last one
207#define OP(s,data,elem) BOOST_PP_CAT(data, elem) // OP to add "_"
208#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, BOOST_PP_SEQ_PUSH_BACK(statetypes, const ACTION::PARAMS &), BOOST_PP_SEQ_TRANSFORM(OP, _, BOOST_PP_SEQ_PUSH_BACK(statereferences, params)))
209#else /// if not, params is only list
210#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, (const ACTION::PARAMS &), (_params))
211#endif
212#define BOOST_PP_LOCAL_LIMITS (0, MAXSTATETYPES)
213#include BOOST_PP_LOCAL_ITERATE()
214) :
215#if defined statetypes && defined statereferences // do we have parameters at all?
216BOOST_PP_REPEAT(MAXSTATETYPES, initialiser_print, statereferences)
217#endif
218params(_params)
219 {}
220
221#if defined statetypes && defined statereferences // do we have parameters at all?
222#define BOOST_PP_LOCAL_MACRO(n) type_print(~, n, statetypes, statereferences, ;)
223#define BOOST_PP_LOCAL_LIMITS (0, MAXSTATETYPES-1)
224#include BOOST_PP_LOCAL_ITERATE()
225#endif
226 ACTION::PARAMS params;
227};
228#endif /* statenecessary */
229
230// (const) prototype to be placed into the ActionRegistry (must be deleted by registry itself)
231//const ACTION INSTANCE;
232//boost::shared_ptr< ACTION > INSTANCE( new ACTION() );
233
234// =========== constructor ===========
235ACTION::ACTION () :
236 Action(ActionTraits< ACTION >(), NULL)
237{}
238
239// =========== destructor ===========
240ACTION::~ACTION ()
241{
242 //std::cout << "Action ACTION is being destroyed." << std::endl;
243}
244
245// =========== parameter constructor ===========
246ACTION::PARAMS::PARAMS()
247#if defined paramtokens && defined paramreferences && defined paramvalids
248 :
249#define BOOST_PP_LOCAL_MACRO(n) valid_print(~, n, paramtokens, paramreferences, paramvalids, paramdefaults)
250#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
251#include BOOST_PP_LOCAL_ITERATE()
252#endif
253 {}
254
255ACTION::PARAMS::PARAMS(const PARAMS &p)
256#if defined paramtokens && defined paramreferences
257 :
258#define BOOST_PP_LOCAL_MACRO(n) validcopy_print(~, n, paramtokens, paramreferences, p)
259#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
260#include BOOST_PP_LOCAL_ITERATE()
261#endif
262 {}
263
264// =========== fill a dialog ===========
265Dialog* ACTION::fillDialog(Dialog *dialog) {
266 ASSERT(dialog,"No Dialog given when filling actionname's dialog");
267#if BOOST_PP_EQUAL(MAXPARAMTYPES,0)
268 dialog->queryEmpty(TOKEN, Traits.getDescription());
269#else
270#define BOOST_PP_LOCAL_MACRO(n) dialog_print(~, n, ~)
271#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
272#include BOOST_PP_LOCAL_ITERATE()
273#endif
274 return dialog;
275};
276
277// =========== time the action ===========
278// we need this here to have the correct function name
279void ACTION::startTimer() const { Chronos::getInstance().startTiming( std::string( TOKEN ) ); }
280void ACTION::endTimer() const { Chronos::getInstance().endTiming( std::string( TOKEN ) ); }
281
282// =========== command for calling action directly ===========
283void COMMAND(
284#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
285#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
286#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
287#include BOOST_PP_LOCAL_ITERATE()
288#endif
289)
290{
291 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
292 //ACTION::PARAMS params;
293#if defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
294#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, paramreferences, ToCall->params.)
295#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
296#include BOOST_PP_LOCAL_ITERATE()
297#endif
298 ToCall->call(Action::NonInteractive);
299};
300
301void BOOST_PP_CAT( COMMAND, _stringargs)(
302#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
303#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, BOOST_PP_SEQ_TRANSFORM( type2string, , paramtypes), paramreferences)
304#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
305#include BOOST_PP_LOCAL_ITERATE()
306#endif
307 ) {
308 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
309 //ACTION::PARAMS params;
310#if defined paramtypes && defined paramtypes && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
311#define BOOST_PP_LOCAL_MACRO(n) valuetype_print(~, n, paramreferences, paramtypes, ToCall->params. )
312#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
313#include BOOST_PP_LOCAL_ITERATE()
314#endif
315 ToCall->call(MoleCuilder::Action::NonInteractive);
316};
317
318}
319
320// free up defines
321#undef paramvalids
322#undef paramtypes
323#undef paramtokens
324#undef paramreferences
325#undef paramdescriptions
326#undef paramdefaults
327#undef MAXPARAMTYPES
328#undef MAXPARAMDEFAULTS
329#undef statetypes
330#undef statereferences
331#undef MAXSTATETYPES
332#undef PARAM_DEFAULT
333
334#undef type2string
335#undef stringtype
336#undef initialiser_print
337#undef type_print
338#undef type_list
339#undef dialog_print
340#undef sequencer
341#undef valid_print
342#undef validcopy_print
343#undef value_print
344#undef valuetype_print
345
346#undef ACTION
347#undef COMMAND
348#undef PARAMS
349#undef STATE
350#undef INSTANCE
351
352#undef ACTIONNAME
353#undef CATEGORY
354#undef TOKEN
Note: See TracBrowser for help on using the repository browser.