- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/Action_impl_header.hpp
rb4fa106 rc38826 20 20 #include <boost/preprocessor/seq/transform.hpp> 21 21 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 23 31 #define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action)) 24 32 #define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME) 25 33 #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 27 39 // check if no lists given 28 40 #ifndef paramtypes … … 33 45 34 46 // check user has given name and category 35 #ifndef CATEGORY36 ERROR: No "CATEGORY" defined in: __FILE__37 #endif38 39 47 #ifndef ACTIONNAME 40 48 ERROR: No "ACTIONNAME" defined in: __FILE__ … … 50 58 BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\ 51 59 ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \ 60 ) 61 #endif 62 #ifdef paramdescriptions 63 BOOST_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 70 BOOST_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 88 BOOST_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__ \ 52 90 ) 53 91 #endif … … 64 102 BOOST_PP_SEQ_ELEM(n, TYPELIST) \ 65 103 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 66 133 67 134 #if defined paramtypes && defined paramreferences … … 75 142 #endif 76 143 144 class ACTION; 145 146 template <> 147 class ActionTrait<ACTION> : public ActionTraits { 148 public: 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 77 182 class ACTION : public Action { 78 friend79 183 #if defined paramtypes && defined paramreferences 80 void COMMAND(184 friend void COMMAND( 81 185 #define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences) 82 186 #define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1) … … 94 198 bool shouldUndo(); 95 199 96 virtual const std::string getName();97 98 200 struct PARAMS : ActionParameters { 99 201 #if defined paramtypes && defined paramreferences … … 111 213 virtual Action::state_ptr performUndo(Action::state_ptr); 112 214 virtual Action::state_ptr performRedo(Action::state_ptr); 113 114 static const char NAME[];115 215 }; 116 216 … … 118 218 #undef paramtokens 119 219 #undef paramreferences 220 #undef paramdescriptions 221 #undef paramdefaults 120 222 #undef MAXPARAMTYPES 121 223 #undef statetypes … … 130 232 #undef ACTIONNAME 131 233 #undef CATEGORY 234 #undef MENUNAME 235 #undef MENUPOSITION 132 236 #undef TOKEN 237 238 #undef DESCRIPTION 239 #undef SHORTFORM
Note:
See TracChangeset
for help on using the changeset viewer.