Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/Action_impl_header.hpp

    rb4fa106 rc38826  
    2020#include <boost/preprocessor/seq/transform.hpp>
    2121
    22 // some derived names
     22#include <iostream>
     23#include <typeinfo>
     24
     25#include "Actions/ActionTraits.hpp"
     26#include "Actions/OptionTrait.hpp"
     27#include "Actions/ValueStorage.hpp"
     28
     29// some derived names: if CATEGORY is not given, we don't prefix with it
     30#ifdef CATEGORY
    2331#define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
    2432#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
    2533#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
    26 
     34#else
     35#define ACTION BOOST_PP_CAT(ACTIONNAME, Action)
     36#define COMMAND ACTIONNAME
     37#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
     38#endif
    2739// check if no lists given
    2840#ifndef paramtypes
     
    3345
    3446// check user has given name and category
    35 #ifndef CATEGORY
    36 ERROR: No "CATEGORY" defined in: __FILE__
    37 #endif
    38 
    3947#ifndef ACTIONNAME
    4048ERROR: No "ACTIONNAME" defined in: __FILE__
     
    5058BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\
    5159  ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \
     60)
     61#endif
     62#ifdef paramdescriptions
     63BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdescriptions)),\
     64  ERROR: There are not the same number of "paramtokens" and "paramdescriptions" in: __FILE__ \
     65)
     66#endif
     67
     68// check for mandatory defines
     69#ifndef DESCRIPTION
     70BOOST_PP_ASSERT_MSG(0, \
     71    "ERROR: Description is mandatory for Actions, here for ACTION " \
     72)
     73#endif
     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__ \
    5290)
    5391#endif
     
    64102  BOOST_PP_SEQ_ELEM(n, TYPELIST) \
    65103  BOOST_PP_SEQ_ELEM(n, VARLIST)
     104
     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
    66133
    67134#if defined paramtypes && defined paramreferences
     
    75142#endif
    76143
     144class ACTION;
     145
     146template <>
     147class ActionTrait<ACTION> : public ActionTraits {
     148public:
     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 */
     155  {
     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, ~, )
     168#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
     169#include BOOST_PP_LOCAL_ITERATE()
     170#endif
     171  // associate action's short form also with option
     172#ifdef SHORTFORM
     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;
     177  }
     178
     179  ~ActionTrait() {}
     180};
     181
    77182class ACTION : public Action {
    78   friend
    79183  #if defined paramtypes && defined paramreferences
    80   void COMMAND(
     184  friend void COMMAND(
    81185  #define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
    82186  #define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
     
    94198  bool shouldUndo();
    95199
    96   virtual const std::string getName();
    97 
    98200  struct PARAMS : ActionParameters {
    99201  #if defined paramtypes && defined paramreferences
     
    111213  virtual Action::state_ptr performUndo(Action::state_ptr);
    112214  virtual Action::state_ptr performRedo(Action::state_ptr);
    113 
    114   static const char NAME[];
    115215};
    116216
     
    118218#undef paramtokens
    119219#undef paramreferences
     220#undef paramdescriptions
     221#undef paramdefaults
    120222#undef MAXPARAMTYPES
    121223#undef statetypes
     
    130232#undef ACTIONNAME
    131233#undef CATEGORY
     234#undef MENUNAME
     235#undef MENUPOSITION
    132236#undef TOKEN
     237
     238#undef DESCRIPTION
     239#undef SHORTFORM
Note: See TracChangeset for help on using the changeset viewer.