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