source: src/Actions/Action_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.2 KB
RevLine 
[0b2ce9]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
[b4fa106]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
[0b2ce9]24 * -# CATEGORY, e.g. Analysis
25 * -# ACTIONNAME, e.g. MolecularVolume
26 */
27
[56f73b]28// include config.h
29#ifdef HAVE_CONFIG_H
30#include <config.h>
31#endif
[9ee38b]32
[862b6a]33#include "CodePatterns/Chronos.hpp"
34
[9ee38b]35#include <boost/preprocessor/cat.hpp>
[b4fa106]36#include <boost/preprocessor/expand.hpp>
[9ee38b]37#include <boost/preprocessor/comparison/equal.hpp>
38#include <boost/preprocessor/comparison/not_equal.hpp>
[6ba9ba]39#include <boost/preprocessor/control/expr_if.hpp>
[9ee38b]40#include <boost/preprocessor/control/if.hpp>
41#include <boost/preprocessor/debug/assert.hpp>
42#include <boost/preprocessor/iteration/local.hpp>
[6ba9ba]43#include <boost/preprocessor/list/adt.hpp>
[9ee38b]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
[628577]52#include "Actions/ActionQueue.hpp"
[f10b0c]53#include "Parameters/Parameter.hpp"
54
[649aaa]55
[e4afb4]56// some derived names: if CATEGORY is not given, we don't prefix with it
57#ifdef CATEGORY
[9ee38b]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))
[e4afb4]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
[2a6a2c]68#define INSTANCE BOOST_PP_CAT(this_, BOOST_PP_CAT(ACTIONNAME, _instance))
[9ee38b]69
70// check if no lists given
[b4fa106]71#ifndef paramtypes
72#define MAXPARAMTYPES 0
[9ee38b]73#else
[b4fa106]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)
[9ee38b]80#endif
[6ba9ba]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)
[9ee38b]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
[b4fa106]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__ \
[9ee38b]102)
103#endif
[b4fa106]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__ \
[9ee38b]113)
114#endif
115
116// print a list of type ref followed by a separator, i.e. "int i;"
[b4fa106]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)\
[9ee38b]125 separator
126
127// print a list of type ref followed, i.e. "int i, double position"
[b4fa106]128#define type_list(z,n,TYPELIST,VARLIST) \
[9ee38b]129 BOOST_PP_COMMA_IF(n)\
[b4fa106]130 BOOST_PP_SEQ_ELEM(n, TYPELIST) \
131 BOOST_PP_SEQ_ELEM(n, VARLIST)
[9ee38b]132
[b4fa106]133// prints dialog->query calls for paramtypes with tokens
[9ee38b]134#define dialog_print(z,n,unused) \
135 dialog->query<\
[b4fa106]136 BOOST_PP_SEQ_ELEM(n, paramtypes)\
[f10b0c]137 >( params. \
138 BOOST_PP_SEQ_ELEM(n, paramreferences)\
139 ,\
[b4fa106]140 BOOST_PP_SEQ_ELEM(n, paramtokens)\
[e4afb4]141 , Traits.getDescription()\
142 );
[9ee38b]143
[6ba9ba]144// print an initialiser list, i.e. "var( token, valid (,default) )(,)"
145#define valid_print(z,n,TOKENLIST, VARLIST, VALIDLIST, DEFAULTLIST) \
[649aaa]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) \
[6ba9ba]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) )) \
[649aaa]156 )
157
[6ba9ba]158// print an initialiser list, i.e. "var( valid . var )(,)"
[649aaa]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
[9ee38b]167// prints set/queryCurrentValue (command) for paramreferences and paramtokens
[f10b0c]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)\
[9ee38b]173 );
174
[88ba1f]175// prints set/queryCurrentValue (command) for paramreferences and paramtokens
[f10b0c]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) \
[88ba1f]181 );
182
183#define stringtype std::string
184
185#define type2string(s, data, elem) \
186 stringtype
187
188
[3139b2]189//#include "Actions/ActionTraits.hpp"
[0b2ce9]190#include "UIElements/Dialog.hpp"
191
[e4afb4]192#ifdef paramtokens
193#define statenecessary 1
194#endif
195#ifndef statetokens
196#define statenecessary 1
197#endif
[9ee38b]198
[ce7fdc]199namespace MoleCuilder {
200
[b4fa106]201// =========== memento to remember the state when undoing ===========
[e4afb4]202#ifdef statenecessary
[b4fa106]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 {}
[0b2ce9]220
[b4fa106]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};
[e4afb4]228#endif /* statenecessary */
[0b2ce9]229
[2a6a2c]230// (const) prototype to be placed into the ActionRegistry (must be deleted by registry itself)
[83e90c]231//const ACTION INSTANCE;
232//boost::shared_ptr< ACTION > INSTANCE( new ACTION() );
[2a6a2c]233
[b4fa106]234// =========== constructor ===========
[0b2ce9]235ACTION::ACTION () :
[0c8056]236 Action(ActionTraits< ACTION >(), NULL)
[0b2ce9]237{}
238
[b4fa106]239// =========== destructor ===========
[0b2ce9]240ACTION::~ACTION ()
[e4afb4]241{
242 //std::cout << "Action ACTION is being destroyed." << std::endl;
243}
[0b2ce9]244
[649aaa]245// =========== parameter constructor ===========
246ACTION::PARAMS::PARAMS()
247#if defined paramtokens && defined paramreferences && defined paramvalids
248 :
[6ba9ba]249#define BOOST_PP_LOCAL_MACRO(n) valid_print(~, n, paramtokens, paramreferences, paramvalids, paramdefaults)
[649aaa]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
[b4fa106]264// =========== fill a dialog ===========
[0b2ce9]265Dialog* ACTION::fillDialog(Dialog *dialog) {
266 ASSERT(dialog,"No Dialog given when filling actionname's dialog");
[b4fa106]267#if BOOST_PP_EQUAL(MAXPARAMTYPES,0)
[e4afb4]268 dialog->queryEmpty(TOKEN, Traits.getDescription());
[0b2ce9]269#else
270#define BOOST_PP_LOCAL_MACRO(n) dialog_print(~, n, ~)
[b4fa106]271#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
[0b2ce9]272#include BOOST_PP_LOCAL_ITERATE()
273#endif
274 return dialog;
275};
276
[862b6a]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
[b4fa106]282// =========== command for calling action directly ===========
283void COMMAND(
[f10b0c]284#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
[b4fa106]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
[05736a]289)
[0b2ce9]290{
[1d3563]291 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
[ddde10]292 //ACTION::PARAMS params;
[f10b0c]293#if defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
294#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, paramreferences, ToCall->params.)
[b4fa106]295#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
[0b2ce9]296#include BOOST_PP_LOCAL_ITERATE()
297#endif
[9ee38b]298 ToCall->call(Action::NonInteractive);
[0b2ce9]299};
300
[88ba1f]301void BOOST_PP_CAT( COMMAND, _stringargs)(
[f10b0c]302#if defined paramtypes && defined paramreferences && BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
[88ba1f]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 ) {
[1d3563]308 ACTION *ToCall = dynamic_cast<ACTION*>(ActionQueue::getInstance().getActionByName( TOKEN )); //->clone(params);
[88ba1f]309 //ACTION::PARAMS params;
[f10b0c]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. )
[88ba1f]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
[ce7fdc]318}
319
[b4fa106]320// free up defines
[649aaa]321#undef paramvalids
[b4fa106]322#undef paramtypes
323#undef paramtokens
324#undef paramreferences
[649aaa]325#undef paramdescriptions
326#undef paramdefaults
[b4fa106]327#undef MAXPARAMTYPES
[6ba9ba]328#undef MAXPARAMDEFAULTS
[b4fa106]329#undef statetypes
330#undef statereferences
331#undef MAXSTATETYPES
[6ba9ba]332#undef PARAM_DEFAULT
[0b2ce9]333
[88ba1f]334#undef type2string
335#undef stringtype
[a02f78]336#undef initialiser_print
337#undef type_print
338#undef type_list
339#undef dialog_print
[6ba9ba]340#undef sequencer
[649aaa]341#undef valid_print
342#undef validcopy_print
[a02f78]343#undef value_print
[88ba1f]344#undef valuetype_print
[a02f78]345
[9ee38b]346#undef ACTION
347#undef COMMAND
348#undef PARAMS
349#undef STATE
[2a6a2c]350#undef INSTANCE
[b4fa106]351
352#undef ACTIONNAME
353#undef CATEGORY
[9ee38b]354#undef TOKEN
Note: See TracBrowser for help on using the repository browser.