[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_ */
|
---|