Ignore:
Timestamp:
Oct 30, 2010, 8:42:44 PM (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:
76cec6, c38826
Parents:
23359f
git-author:
Frederik Heber <heber@…> (10/30/10 19:55:54)
git-committer:
Frederik Heber <heber@…> (10/30/10 20:42:44)
Message:

Huge refactoring: Introduction of Traits to Actions.

This change is really big but the introduction of the Trait concept (at least
in its current light form) is so fundamental that lots of pieces had to be
changed in order to get everything working.

The main point why it was necessary to add these traits in the first place was
to comfortably allow for adding extension of Actions information-wise, i.e.
with stuff that is only important for the QtUI, such as icons, or tooltips, ...
This extra information should not be stored with Action itself, as it has
nothing to do with the workings of the Action. And neither should it get
stored with some blown-out-of-proportions MapOfActions class ...

The gist of the change is as follows:

  • OptionTrait contains the token, description, shortform and type of an option, such as ("position", "position in space, none, typeid(Vector)).
  • ActionTrait is the derived form for actions where additionally MenuPosition and MenuName are stored (and probably more to come for the GUI), also we have a set of OptionTrait instances, one for each option of the Action.
  • Action then contains this ActionTrait, specialized for each Action.
  • the preprocessor macros have been enhanced to gather all this information from the .def files.
  • MapOfActions is gone. Completely. Most of its use was to store this extra information and the ValueStorage part now is just in class ValueStorage.
  • ValueStorage is no more an interface to MapOfActions but as the name says a (type-safe) ValueStorage.

Listing the (remaining) changes in alphabetical order of the class:

  • Action
    • member value ::name dropped, ::getName() uses ActionTraits::getName()
    • new define NODEFAULT which is used in paramdefaults in .def files
    • all derived actions classes such as Process, Calculations, MakroAction,... have been adapated to use the ActionTrait concept as well.
  • ActionHistory
    • extraced RedoAction and UndoAction, shifted implementation into their own object files and they use .def files as well (i.e. streamlined with method used for other actions)
  • MenuDescription
    • contain information on Menus such as name, ...
    • new unit test checks for consistency
  • molecule
    • const member functions: Copy(), Output() and OutputBonds()
  • OptionRegistry
    • new registry class for options only
    • we want the same type throughout the code for each token, e.g. "position"
    • the registry containts checks for consistency
  • OptionTrait
    • default values are specified in paramdefaults, none are given by NODEFAULT
    • introduced default for translate-atoms, point-correlation, pair-correlation
  • Registry pattern
    • new unit test, but only sceleton code so far
  • ...Query, also ...Pipe
    • atoms, molecule and elements are now all const
    • also ValueStorage's signatures all have const therein
  • ValueStorage
    • set/queryCurrentValue from MapOfActions
    • at times VectorValue has been in .def files where Vector was in the signature. This is cleared. Such stuff is only present for e.g. BoxVector being queried as a Vector. But this is a feature and intended.
  • World
    • most of the (un)selection functions now work on const atoms and molecules
    • in one case we need a const_cast to remove this, but this is intentional, as the vector of selected atoms stores non-const pointers and this is ok.

There is only one test which had to be changed slightly because a specific
option token as "position" must now have the same type everywhere, e.g. always
Vector.

  • TESTFIX: Simple_configuration/2: --position -> --domain-position (and associated to BoxVector)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/Action_impl_header.hpp

    r23359f re4afb4  
    2020#include <boost/preprocessor/seq/transform.hpp>
    2121
     22#include <iostream>
     23#include <typeinfo>
     24
     25#include "Actions/ActionTraits.hpp"
     26#include "Actions/OptionTrait.hpp"
    2227#include "Actions/ValueStorage.hpp"
    2328
    24 // some derived names
     29// some derived names: if CATEGORY is not given, we don't prefix with it
     30#ifdef CATEGORY
    2531#define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
    2632#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
    2733#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
    28 
     34#else
     35#define ACTION BOOST_PP_CAT(ACTIONNAME, Action)
     36#define COMMAND ACTIONNAME
     37#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
     38#endif
    2939// check if no lists given
    3040#ifndef paramtypes
     
    3545
    3646// check user has given name and category
    37 #ifndef CATEGORY
    38 ERROR: No "CATEGORY" defined in: __FILE__
    39 #endif
    40 
    4147#ifndef ACTIONNAME
    4248ERROR: No "ACTIONNAME" defined in: __FILE__
     
    6672)
    6773#endif
    68 #ifndef TYPEINFO
    69 BOOST_PP_ASSERT_MSG(0, \
    70     "ERROR: Type is mandatory for Actions, here for ACTION " \
     74
     75// check if paramdefaults is given, otherwise fill list with NODEFAULT
     76// this does not work: paramdefaults has to be completely defined before
     77// being used within option_print (used as an array there and not as
     78// some function call still to be expanded)
     79//#define paramdefaults (NODEFAULT)
     80//#define tempvalue(z,n,value)
     81//  BOOST_PP_CAT(value,(NODEFAULT))
     82//BOOST_PP_REPEAT(tempvalue, MAXPARAMTYPES, paramdefaults)
     83//#undef tempvalue
     84//#else
     85
     86// if present, check if correct number of arguments
     87#ifdef paramdefaults
     88BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdefaults)),\
     89  ERROR: There are not the same number of "paramtokens" and "paramdefaults" in: __FILE__ \
    7190)
    7291#endif
     
    84103  BOOST_PP_SEQ_ELEM(n, VARLIST)
    85104
    86 // prints OptionDescription.insert
    87 #define optiondescription_print(z,n,unused, unused2) \
    88   OptionDescription. insert (\
    89       pair<std::string, std::string> (\
    90   BOOST_PP_SEQ_ELEM(n, paramtokens), \
    91   BOOST_PP_SEQ_ELEM(n, paramdescriptions) )\
    92   );
    93 
     105// prints Options.insert
     106#ifdef paramdefaults
     107#define option_print(z,n,unused, unused2) \
     108  tester = Options. insert (\
     109      std::pair< std::string, OptionTrait *> ( \
     110      BOOST_PP_SEQ_ELEM(n, paramtokens), \
     111      new OptionTrait(\
     112          BOOST_PP_SEQ_ELEM(n, paramtokens), \
     113          &typeid( BOOST_PP_SEQ_ELEM(n, paramtypes) ), \
     114          BOOST_PP_SEQ_ELEM(n, paramdescriptions), \
     115          BOOST_PP_SEQ_ELEM(n, paramdefaults) )\
     116      )\
     117  ); \
     118  ASSERT(tester.second, "ActionTrait<ACTION>::ActionTrait<ACTION>() option token present twice!");
     119#else
     120#define option_print(z,n,unused, unused2) \
     121  tester = Options. insert (\
     122      std::pair< std::string, OptionTrait *> ( \
     123      BOOST_PP_SEQ_ELEM(n, paramtokens), \
     124      new OptionTrait(\
     125          BOOST_PP_SEQ_ELEM(n, paramtokens), \
     126          &typeid( BOOST_PP_SEQ_ELEM(n, paramtypes) ), \
     127          BOOST_PP_SEQ_ELEM(n, paramdescriptions), \
     128          NODEFAULT )\
     129      )\
     130  ); \
     131  ASSERT(tester.second, "ActionTrait<ACTION>::ActionTrait<ACTION>() option token present twice!");
     132#endif
    94133
    95134#if defined paramtypes && defined paramreferences
     
    108147class ActionTrait<ACTION> : public ActionTraits {
    109148public:
    110   ActionTrait()
     149  ActionTrait() :
     150#ifndef SHORTFORM
     151    ActionTraits(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string()))
     152#else
     153    ActionTraits(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string(), SHORTFORM))
     154#endif /* SHORTFORM */
    111155  {
    112 #ifdef DEFAULTVALUE
    113     CurrentValue = DEFAULTVALUE;
    114 #endif
    115 #ifdef DESCRIPTION
    116     Description = DESCRIPTION;
    117 #endif
    118 #ifdef paramdescriptions
    119 #define BOOST_PP_LOCAL_MACRO(n) optiondescription_print(~, n, ~, )
     156  // initialize remainder of action info
     157#ifdef MENUNAME
     158    MenuTitle = MENUNAME;
     159#endif
     160#ifdef MENUPOSITION
     161    MenuPosition = MENUPOSITION;
     162#endif
     163
     164  // initialize action's options
     165  std::pair< ActionTraits::options_iterator, bool > tester;
     166#ifdef paramtokens
     167#define BOOST_PP_LOCAL_MACRO(n) option_print(~, n, ~, )
    120168#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
    121169#include BOOST_PP_LOCAL_ITERATE()
    122170#endif
    123 #ifdef MENUNAME
    124     MenuTitle = MENUNAME;
    125 #endif
    126 #ifdef MENUPOSITION
    127     MenuPosition = MENUPOSITION;
    128 #endif
     171  // associate action's short form also with option
    129172#ifdef SHORTFORM
    130     ShortForm = SHORTFORM;
    131 #endif
    132 #ifdef TYPEINFO
    133     InternalType = TYPEINFO;
    134 #endif
     173  if (Options.find(TOKEN) != Options.end())
     174    Options[TOKEN]->setShortForm(std::string(SHORTFORM));
     175#endif /* SHORTFORM */
     176  std::cout << "ActionTrait<ACTION>::ActionTrait() with " << getName() << ", type " << getTypeName() << " and description " << getDescription() << std::endl;
    135177  }
    136178
     
    139181
    140182class ACTION : public Action {
    141   friend
    142183  #if defined paramtypes && defined paramreferences
    143   void COMMAND(
     184  friend void COMMAND(
    144185  #define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
    145186  #define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
     
    157198  bool shouldUndo();
    158199
    159   virtual const std::string getName();
    160 
    161200  struct PARAMS : ActionParameters {
    162201  #if defined paramtypes && defined paramreferences
     
    167206  } params;
    168207
    169   ActionTrait<ACTION> Traits;
    170 
    171208protected:
    172209  virtual Dialog * fillDialog(Dialog*);
     
    176213  virtual Action::state_ptr performUndo(Action::state_ptr);
    177214  virtual Action::state_ptr performRedo(Action::state_ptr);
    178 
    179   static const char NAME[];
    180215};
    181216
     
    183218#undef paramtokens
    184219#undef paramreferences
     220#undef paramdescriptions
     221#undef paramdefaults
    185222#undef MAXPARAMTYPES
    186223#undef statetypes
     
    195232#undef ACTIONNAME
    196233#undef CATEGORY
     234#undef MENUNAME
     235#undef MENUPOSITION
    197236#undef TOKEN
     237
     238#undef DESCRIPTION
     239#undef SHORTFORM
Note: See TracChangeset for help on using the changeset viewer.