Ignore:
Timestamp:
Aug 28, 2010, 12:52:58 AM (15 years ago)
Author:
Frederik Heber <heber@…>
Branches:
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
Children:
b4fa106
Parents:
0b2ce9
git-author:
Frederik Heber <heber@…> (08/25/10 17:20:37)
git-committer:
Frederik Heber <heber@…> (08/28/10 00:52:58)
Message:

Extended macro framework.

Extensions:

  • all central definitions reside in .def files
    • This if file is necessary because we need the definitions at two places: hpp and cpp
    • And as we always use the same define names, we have to undefine them at the end of both (otherwise we get compiler warnings and are prone to dumb mistakes of forgotten defines seeming present)
  • the .hpp is just a very tiny header, that should be possible to batch- construct inside Makefile as well
  • .cpp includes some Action_...hpp files and implements the function

For later (i.e. when ActionRegistry becomes prototype copier)

  • instead of waiting for clone(), for now we simply call the prototype.
  • in the action command we must not yet prefix paramreferences with "params."

Changes:

  • Dialog::query<> is a template which is specialized for every present query...() function. We need it to automatize fillDialog()
  • all AnalysisAction's are now converted, i.e. framework is functional with parameters and queries (MolecularVolume had none).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/Action_impl_pre.hpp

    r0b2ce9 r9ee38b  
    2323 */
    2424
     25
     26#include <boost/preprocessor/cat.hpp>
     27#include <boost/preprocessor/comparison/equal.hpp>
     28#include <boost/preprocessor/comparison/not_equal.hpp>
     29#include <boost/preprocessor/control/if.hpp>
     30#include <boost/preprocessor/debug/assert.hpp>
     31#include <boost/preprocessor/iteration/local.hpp>
     32#include <boost/preprocessor/punctuation/comma_if.hpp>
     33#include <boost/preprocessor/repetition/repeat.hpp>
     34#include <boost/preprocessor/seq/elem.hpp>
     35#include <boost/preprocessor/seq/push_back.hpp>
     36#include <boost/preprocessor/seq/seq.hpp>
     37#include <boost/preprocessor/seq/size.hpp>
     38#include <boost/preprocessor/seq/transform.hpp>
     39
     40// some derived names
     41#define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
     42#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
     43#define STATE BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, State))
     44#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
     45#define PARAMSDOT BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
     46
     47// check if no lists given
     48#ifndef types
     49#define MAXNOTOKENS 0
     50#else
     51#define MAXNOTOKENS BOOST_PP_SEQ_SIZE(types)
     52#endif
     53
     54// check user has given name and category
     55#ifndef CATEGORY
     56ERROR: No "CATEGORY" defined in: __FILE__
     57#endif
     58
     59#ifndef ACTIONNAME
     60ERROR: No "ACTIONNAME" defined in: __FILE__
     61#endif
     62
     63// calculate numbers and check whether all have same size
     64#ifdef tokens
     65BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXNOTOKENS, BOOST_PP_SEQ_SIZE(tokens)),\
     66  ERROR: There are not the same number of "tokens" and "types" in: __FILE__ \
     67)
     68#endif
     69#ifdef references
     70BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXNOTOKENS, BOOST_PP_SEQ_SIZE(references)),\
     71  ERROR: There are not the same number of "tokens" and "references" in: __FILE__ \
     72)
     73#endif
     74
     75// print a list of type ref followed by a separator, i.e. "int i;"
     76#define type_print(z,n,separator) \
     77  BOOST_PP_SEQ_ELEM(n, types) \
     78  BOOST_PP_SEQ_ELEM(n, references)\
     79  separator
     80
     81// print a list of type ref followed, i.e. "int i, double position"
     82#define type_list(z,n,unused) \
     83  BOOST_PP_COMMA_IF(n)\
     84  BOOST_PP_SEQ_ELEM(n, types) \
     85  BOOST_PP_SEQ_ELEM(n, references)
     86
     87// prints dialog->query calls for types with tokens
     88#define dialog_print(z,n,unused) \
     89  dialog->query<\
     90  BOOST_PP_SEQ_ELEM(n, types)\
     91  >(\
     92  BOOST_PP_SEQ_ELEM(n, tokens)\
     93  , ValueStorage::getInstance().getDescription(\
     94  BOOST_PP_SEQ_ELEM(n, tokens)\
     95  ));
     96
     97// prints set/queryCurrentValue (command) for paramreferences and paramtokens
     98#define value_print(z,n,command, prefix) \
     99  ValueStorage::getInstance(). command (\
     100  BOOST_PP_SEQ_ELEM(n, tokens)\
     101  , \
     102  prefix\
     103  BOOST_PP_SEQ_ELEM(n, references)\
     104  );
     105
     106#if BOOST_PP_NOT_EQUAL(MAXNOTOKENS,0)
     107#define COMMANDFULL \
     108void COMMAND( \
     109BOOST_PP_REPEAT(MAXNOTOKENS, type_list, ~) \
     110)
     111# else
     112#define COMMANDFULL void COMMAND()
     113#endif
     114
    25115#include "Actions/ActionRegistry.hpp"
    26116#include "UIElements/Dialog.hpp"
    27117#include "Actions/ValueStorage.hpp"
     118
    28119
    29120const char ACTION::NAME[] = TOKEN;
     
    52143};
    53144
    54 struct PARAMS : ActionParameters {
     145COMMANDFULL
     146{
     147  ACTION::PARAMS params;
     148  Action *ToCall = ActionRegistry::getInstance().getActionByName( ACTION::NAME ); //->clone(params);
    55149#if BOOST_PP_NOT_EQUAL(MAXNOTOKENS,0)
    56 #define BOOST_PP_LOCAL_MACRO(n) type_print(~, n, ;)
     150#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, setCurrentValue, )
    57151#define BOOST_PP_LOCAL_LIMITS  (0, MAXNOTOKENS-1)
    58152#include BOOST_PP_LOCAL_ITERATE()
     
    60154#undef BOOST_PP_LOCAL_LIMITS
    61155#endif
     156  ToCall->call(Action::NonInteractive);
    62157};
    63158
    64 COMMANDFULL
    65 {
     159void ACTION::getParametersfromValueStorage() {
    66160#if BOOST_PP_NOT_EQUAL(MAXNOTOKENS,0)
    67 #define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, setCurrentValue)
    68 #define BOOST_PP_LOCAL_LIMITS  (0, MAXNOTOKENS-1)
    69 #include BOOST_PP_LOCAL_ITERATE()
    70 #undef BOOST_PP_LOCAL_MACRO
    71 #undef BOOST_PP_LOCAL_LIMITS
    72 #endif
    73         ActionRegistry::getInstance().getActionByName( ACTION::NAME )->call(Action::NonInteractive);
    74 };
    75 
    76 void AnalysisMolecularVolumeAction::getParametersfromValueStorage() {
    77 #if BOOST_PP_NOT_EQUAL(MAXNOTOKENS,0)
    78 #define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, queryCurrentValue)
     161#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, queryCurrentValue, params.)
    79162#define BOOST_PP_LOCAL_LIMITS  (0, MAXNOTOKENS-1)
    80163#include BOOST_PP_LOCAL_ITERATE()
     
    89172#undef MAXNOTOKENS
    90173
     174#undef ACTION
     175#undef ACTIONNAME
     176#undef CATEGORY
     177#undef COMMAND
     178#undef COMMANDFULL
     179#undef PARAMS
     180#undef STATE
     181#undef TOKEN
Note: See TracChangeset for help on using the changeset viewer.