| [3f9eba] | 1 | /*
 | 
|---|
 | 2 |  * TemplatePowerSetGenerator.hpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Dec 31, 2010
 | 
|---|
 | 5 |  *      Author: heber
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #ifndef TEMPLATEPOWERSETGENERATOR_HPP_
 | 
|---|
 | 9 | #define TEMPLATEPOWERSETGENERATOR_HPP_
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | // include config.h
 | 
|---|
 | 12 | #ifdef HAVE_CONFIG_H
 | 
|---|
 | 13 | #include <config.h>
 | 
|---|
 | 14 | #endif
 | 
|---|
 | 15 | 
 | 
|---|
 | 16 | 
 | 
|---|
 | 17 | // this include is needed for BOOST_PP_LOCAL_ITERATE()
 | 
|---|
 | 18 | #include <boost/preprocessor/iteration/local.hpp>
 | 
|---|
 | 19 | 
 | 
|---|
 | 20 | // this include is needed for BOOST_PP_REPEAT
 | 
|---|
 | 21 | #include <boost/preprocessor/repetition/repeat.hpp>
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | #include <boost/preprocessor/punctuation/comma_if.hpp>
 | 
|---|
 | 24 | #include <boost/preprocessor/seq/elem.hpp>
 | 
|---|
 | 25 | #include <boost/preprocessor/seq/enum.hpp>
 | 
|---|
 | 26 | #include <boost/preprocessor/seq/for_each.hpp>
 | 
|---|
| [c9bc2b7] | 27 | #include <boost/preprocessor/seq/for_each_i.hpp>
 | 
|---|
| [3f9eba] | 28 | #include <boost/preprocessor/stringize.hpp>
 | 
|---|
 | 29 | #include <boost/preprocessor/tuple/elem.hpp>
 | 
|---|
 | 30 | 
 | 
|---|
 | 31 | /** Functions that prints the given elem as [elem].
 | 
|---|
 | 32 |  *
 | 
|---|
 | 33 |  * Use the funcione as follows:
 | 
|---|
 | 34 |  * SquareBracketize(~,~,test)
 | 
|---|
 | 35 |  *
 | 
|---|
 | 36 |  * which would output:
 | 
|---|
 | 37 |  * [test]
 | 
|---|
 | 38 |  */
 | 
|---|
| [c9bc2b7] | 39 | #define SquareBracketize(r, data, i, elem)  \
 | 
|---|
| [3f9eba] | 40 | [ \
 | 
|---|
| [c9bc2b7] | 41 | BOOST_PP_SEQ_ELEM(i, data) \
 | 
|---|
| [3f9eba] | 42 | elem \
 | 
|---|
 | 43 | ]
 | 
|---|
 | 44 | 
 | 
|---|
 | 45 | /** Functions that allows to print a given seq of elements in the way of
 | 
|---|
 | 46 |  *  enumeration declaration.
 | 
|---|
 | 47 |  *
 | 
|---|
 | 48 |  * Use the functions as follows:
 | 
|---|
 | 49 |  * #define BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(seq), n, seqitems_as_struct)
 | 
|---|
 | 50 |  *
 | 
|---|
 | 51 |  * where "seq" is your defined list, e.g.
 | 
|---|
 | 52 |  * #define seq (1)(2)(3)(4)
 | 
|---|
 | 53 |  *
 | 
|---|
 | 54 |  * which would output:
 | 
|---|
 | 55 |  * 1,
 | 
|---|
 | 56 |  * 2,
 | 
|---|
 | 57 |  * 3,
 | 
|---|
 | 58 |  * 4
 | 
|---|
 | 59 |  *
 | 
|---|
 | 60 |  */
 | 
|---|
 | 61 | #define seqitems_as_enum(z,n,seq_with_elements) \
 | 
|---|
 | 62 |   BOOST_PP_COMMA_IF (n) \
 | 
|---|
 | 63 |   BOOST_PP_SEQ_ELEM(n, seq_with_elements)
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 | /** Functions that allows to print a given seq of elements in the way of
 | 
|---|
 | 66 |  *  variable declaration.
 | 
|---|
 | 67 |  *
 | 
|---|
 | 68 |  * Use the functions as follows:
 | 
|---|
 | 69 |  * #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum(seqsize, n, seq)
 | 
|---|
 | 70 |  * #define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(seq)-1 )
 | 
|---|
 | 71 |  * #include BOOST_PP_LOCAL_ITERATE()
 | 
|---|
 | 72 |  *
 | 
|---|
 | 73 |  * where "seq" is your defined list, e.g.
 | 
|---|
 | 74 |  * #define seq (1)(2)(3)(4)
 | 
|---|
 | 75 |  *
 | 
|---|
 | 76 |  * which would output:
 | 
|---|
 | 77 |  * 1;
 | 
|---|
 | 78 |  * 2;
 | 
|---|
 | 79 |  * 3;
 | 
|---|
 | 80 |  * 4;
 | 
|---|
 | 81 |  *
 | 
|---|
 | 82 |  */
 | 
|---|
 | 83 | #define seqitems_as_struct(z,n,seq_with_elements ) \
 | 
|---|
 | 84 |   BOOST_PP_SEQ_ELEM(n, seq_with_elements) ;
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 | /** Functions that allows to print a given seq of elements in the way of
 | 
|---|
 | 87 |  *  std::map from strings to enums.
 | 
|---|
 | 88 |  *
 | 
|---|
 | 89 |  * e.g. let "seq" be defined as
 | 
|---|
 | 90 |  * #define seq (one)(two)(three)(four)
 | 
|---|
 | 91 |  *
 | 
|---|
 | 92 |  * then we use
 | 
|---|
| [1d5a871] | 93 |  * #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_string_enum_map(seqsize, n, seq, EnumMap, name_space)
 | 
|---|
| [3f9eba] | 94 |  * #define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(seq)-1 )
 | 
|---|
 | 95 |  * #include BOOST_PP_LOCAL_ITERATE()
 | 
|---|
 | 96 |  *
 | 
|---|
 | 97 |  * which expands by the preprocessor to:
 | 
|---|
| [1d5a871] | 98 |  * EnumMap["one"] = test:: one;
 | 
|---|
 | 99 |  * EnumMap["two"] = test:: two;
 | 
|---|
 | 100 |  * EnumMap["three"] = test:: three;
 | 
|---|
 | 101 |  * EnumMap["four"] = test:: four;
 | 
|---|
| [3f9eba] | 102 | 
 | 
|---|
 | 103 |  */
 | 
|---|
| [1d5a871] | 104 | #define seqitems_as_string_enum_map(z,n,seq_with_elements, map, name_space) \
 | 
|---|
| [3f9eba] | 105 |   map [BOOST_PP_STRINGIZE( \
 | 
|---|
 | 106 |   BOOST_PP_SEQ_ELEM(n, seq_with_elements) \
 | 
|---|
| [1d5a871] | 107 |   )] = name_space BOOST_PP_SEQ_ELEM(n, seq_with_elements) \
 | 
|---|
| [3f9eba] | 108 |   ;
 | 
|---|
 | 109 | 
 | 
|---|
 | 110 | /** Functions that allows to print a given seq of elements in the way of
 | 
|---|
 | 111 |  *  std::map from strings to enums.
 | 
|---|
 | 112 |  *
 | 
|---|
 | 113 |  * e.g. let "seq" be defined as
 | 
|---|
 | 114 |  * #define seq (one)(two)(three)(four)
 | 
|---|
 | 115 |  *
 | 
|---|
 | 116 |  * then we use
 | 
|---|
 | 117 |  * #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_map(seqsize, n, seq, EnumMap, test::)
 | 
|---|
 | 118 |  * #define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(seq)-1 )
 | 
|---|
 | 119 |  * #include BOOST_PP_LOCAL_ITERATE()
 | 
|---|
 | 120 |  *
 | 
|---|
 | 121 |  * which expands by the preprocessor to:
 | 
|---|
 | 122 |  * EnumMap[one] = test::one;
 | 
|---|
 | 123 |  * EnumMap[two] = test::two;
 | 
|---|
 | 124 |  * EnumMap[three] = test::three;
 | 
|---|
 | 125 |  * EnumMap[four] = test::four;
 | 
|---|
 | 126 | 
 | 
|---|
 | 127 |  */
 | 
|---|
 | 128 | #define seqitems_as_enum_key_map(z,n,seq_with_elements, map, keytype, name_space, suffix) \
 | 
|---|
 | 129 |   map [ \
 | 
|---|
 | 130 |   BOOST_PP_SEQ_ELEM(n, seq_with_elements) \
 | 
|---|
 | 131 |   ] = keytype< name_space BOOST_PP_SEQ_ELEM(n, seq_with_elements) suffix > ();
 | 
|---|
 | 132 | 
 | 
|---|
 | 133 | #define tupel_in_square_brackets(z,n,tupelelement) \
 | 
|---|
 | 134 | [ \
 | 
|---|
 | 135 | tupelelement \
 | 
|---|
 | 136 | ]\
 | 
|---|
 | 137 | 
 | 
|---|
 | 138 | /** Functions that allows to print a given seq of elements in the way of
 | 
|---|
 | 139 |  *  std::map from strings to enums.
 | 
|---|
 | 140 |  *
 | 
|---|
 | 141 |  * e.g. let "seqseq" be defined as
 | 
|---|
 | 142 |  * #define seqseq ((d)(eins)(zwei)(drei))((e)(one)(two)(three))((f)(un)(deux)(troix))
 | 
|---|
 | 143 |  *
 | 
|---|
 | 144 |  * then we use
 | 
|---|
 | 145 |  * #define tableprinter(z,n,seq) BOOST_PP_SEQ_ELEM(n,seq)
 | 
|---|
| [c9bc2b7] | 146 |  * #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_multidimmap(seqsize, n, seqseq, bla::, MultiMap, test::testfunction, test_printer, tableprinter)
 | 
|---|
| [3f9eba] | 147 |  * #define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(seqseq)-1 )
 | 
|---|
 | 148 |  * #include BOOST_PP_LOCAL_ITERATE()
 | 
|---|
 | 149 |  *
 | 
|---|
 | 150 |  * which expands by the preprocessor to:
 | 
|---|
 | 151 |  * MultiMap[eins][zwei][drei] = test:: d;
 | 
|---|
 | 152 |  * MultiMap[one][two][three] = test:: e;
 | 
|---|
 | 153 |  * MultiMap[un][deux][troix] = test:: f;
 | 
|---|
 | 154 | 
 | 
|---|
 | 155 |  */
 | 
|---|
| [c9bc2b7] | 156 | #define seqitems_as_enum_key_multidimmap(z,n, size_tupels, seq_of_tupels, map, tableitems_arg_printer, template_function, template_arg_printer, param_arg_printer) \
 | 
|---|
| [3f9eba] | 157 |   map \
 | 
|---|
| [c9bc2b7] | 158 |   BOOST_PP_REPEAT (size_tupels, tableitems_arg_printer,  BOOST_PP_SEQ_ELEM(n, seq_of_tupels) ) \
 | 
|---|
| [3f9eba] | 159 |   = template_function \
 | 
|---|
| [c9bc2b7] | 160 |   < BOOST_PP_REPEAT(size_tupels, template_arg_printer,  BOOST_PP_SEQ_ELEM(n, seq_of_tupels) ) > (\
 | 
|---|
 | 161 |   BOOST_PP_REPEAT(size_tupels, param_arg_printer,  BOOST_PP_SEQ_ELEM(n, seq_of_tupels) ) );
 | 
|---|
| [3f9eba] | 162 | 
 | 
|---|
 | 163 | 
 | 
|---|
 | 164 | #endif /* TEMPLATEPOWERSETGENERATOR_HPP_ */
 | 
|---|