source: src/Actions/MakroAction_impl_pre.hpp@ d67e6c

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 d67e6c was 0c8056, checked in by Frederik Heber <heber@…>, 12 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.3 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/ActionRegistry.hpp"
190//#include "Actions/ActionTraits.hpp"
191#include "UIElements/Dialog.hpp"
192
193#ifdef paramtokens
194#define statenecessary 1
195#endif
196#ifndef statetokens
197#define statenecessary 1
198#endif
199
200namespace MoleCuilder {
201
202// =========== memento to remember the state when undoing ===========
203#ifdef statenecessary
204class STATE : public ActionState {
205public:
206 STATE(
207#if defined statetypes && defined statereferences // if we have parameters, we have to add "_" before each reference and add the params as the last one
208#define OP(s,data,elem) BOOST_PP_CAT(data, elem) // OP to add "_"
209#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)))
210#else /// if not, params is only list
211#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, (const ACTION::PARAMS &), (_params))
212#endif
213#define BOOST_PP_LOCAL_LIMITS (0, MAXSTATETYPES)
214#include BOOST_PP_LOCAL_ITERATE()
215) :
216#if defined statetypes && defined statereferences // do we have parameters at all?
217BOOST_PP_REPEAT(MAXSTATETYPES, initialiser_print, statereferences)
218#endif
219params(_params)
220 {}
221
222#if defined statetypes && defined statereferences // do we have parameters at all?
223#define BOOST_PP_LOCAL_MACRO(n) type_print(~, n, statetypes, statereferences, ;)
224#define BOOST_PP_LOCAL_LIMITS (0, MAXSTATETYPES-1)
225#include BOOST_PP_LOCAL_ITERATE()
226#endif
227 ACTION::PARAMS params;
228};
229#endif /* statenecessary */
230
231// (const) prototype to be placed into the ActionRegistry (must be deleted by registry itself)
232//const ACTION INSTANCE;
233//boost::shared_ptr< ACTION > INSTANCE( new ACTION() );
234
235// =========== constructor ===========
236ACTION::ACTION () :
237 MakroAction(ActionTraits< ACTION >(), actions, NULL)
238{}
239
240// =========== destructor ===========
241ACTION::~ACTION ()
242{
243 //std::cout << "Action ACTION is being destroyed." << std::endl;
244}
245
246// =========== parameter constructor ===========
247ACTION::PARAMS::PARAMS()
248#if defined paramtokens && defined paramreferences && defined paramvalids
249 :
250#define BOOST_PP_LOCAL_MACRO(n) valid_print(~, n, paramtokens, paramreferences, paramvalids, paramdefaults)
251#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
252#include BOOST_PP_LOCAL_ITERATE()
253#endif
254 {}
255
256ACTION::PARAMS::PARAMS(const PARAMS &p)
257#if defined paramtokens && defined paramreferences
258 :
259#define BOOST_PP_LOCAL_MACRO(n) validcopy_print(~, n, paramtokens, paramreferences, p)
260#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
261#include BOOST_PP_LOCAL_ITERATE()
262#endif
263 {}
264
265// =========== fill a dialog ===========
266Dialog* ACTION::fillDialog(Dialog *dialog) {
267 ASSERT(dialog,"No Dialog given when filling actionname's dialog");
268#if BOOST_PP_EQUAL(MAXPARAMTYPES,0)
269 dialog->queryEmpty(TOKEN, Traits.getDescription());
270#else
271#define BOOST_PP_LOCAL_MACRO(n) dialog_print(~, n, ~)
272#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
273#include BOOST_PP_LOCAL_ITERATE()
274#endif
275 return dialog;
276};
277
278// =========== time the action ===========
279// we need this here to have the correct function name
280void ACTION::startTimer() const { Chronos::getInstance().startTiming( std::string( TOKEN ) ); }
281void ACTION::endTimer() const { Chronos::getInstance().endTiming( std::string( TOKEN ) ); }
282
283// =========== command for calling action directly ===========
284void COMMAND(
285#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
286#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
287#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
288#include BOOST_PP_LOCAL_ITERATE()
289#endif
290)
291{
292 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
293 //ACTION::PARAMS params;
294#if defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
295#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, paramreferences, ToCall->params.)
296#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
297#include BOOST_PP_LOCAL_ITERATE()
298#endif
299 ToCall->call(Action::NonInteractive);
300};
301
302void BOOST_PP_CAT( COMMAND, _stringargs)(
303#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
304#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, BOOST_PP_SEQ_TRANSFORM( type2string, , paramtypes), paramreferences)
305#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
306#include BOOST_PP_LOCAL_ITERATE()
307#endif
308 ) {
309 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
310 //ACTION::PARAMS params;
311#if defined paramtypes && defined paramtypes && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
312#define BOOST_PP_LOCAL_MACRO(n) valuetype_print(~, n, paramreferences, paramtypes, ToCall->params. )
313#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
314#include BOOST_PP_LOCAL_ITERATE()
315#endif
316 ToCall->call(MoleCuilder::Action::NonInteractive);
317};
318
319}
320
321// free up defines
322#undef paramvalids
323#undef paramtypes
324#undef paramtokens
325#undef paramreferences
326#undef paramdescriptions
327#undef paramdefaults
328#undef MAXPARAMTYPES
329#undef MAXPARAMDEFAULTS
330#undef statetypes
331#undef statereferences
332#undef MAXSTATETYPES
333#undef PARAM_DEFAULT
334
335#undef type2string
336#undef stringtype
337#undef initialiser_print
338#undef type_print
339#undef type_list
340#undef dialog_print
341#undef sequencer
342#undef valid_print
343#undef validcopy_print
344#undef value_print
345#undef valuetype_print
346
347#undef ACTION
348#undef COMMAND
349#undef PARAMS
350#undef STATE
351#undef INSTANCE
352
353#undef ACTIONNAME
354#undef CATEGORY
355#undef TOKEN
Note: See TracBrowser for help on using the repository browser.