00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef ACEDIA_PREPROCESSOR_H
00031 #define ACEDIA_PREPROCESSOR_H
00032
00033 #include <boost/preprocessor/seq.hpp>
00034 #include <boost/preprocessor/cat.hpp>
00035 #include <boost/preprocessor/for.hpp>
00036 #include <boost/preprocessor/arithmetic/add.hpp>
00037 #include <boost/preprocessor/repetition/repeat.hpp>
00038 #include <boost/preprocessor/punctuation/comma.hpp>
00039 #include <boost/preprocessor/punctuation/paren.hpp>
00040
00041 #define ACEDIA_STRINGIFY(x) #x
00042 #define ACEDIA_TOSTRING(x) ACEDIA_STRINGIFY(x)
00043 #define ACEDIA_THROW(what, reason) throw what(reason " (in file \"" __FILE__ "\" at line " ACEDIA_TOSTRING(__LINE__) ")")
00044 #define ACEDIA_FILE_AND_LINE() " (in file \"" __FILE__ "\" at line " ACEDIA_TOSTRING(__LINE__) ")"
00045
00046 #define ACEDIA_DEF_T1_TO_T1() typename T1
00047 #define ACEDIA_DEF_T1_TO_T2() typename T1, typename T2
00048 #define ACEDIA_DEF_T1_TO_T3() typename T1, typename T2, typename T3
00049 #define ACEDIA_DEF_T1_TO_T4() typename T1, typename T2, typename T3, typename T4
00050 #define ACEDIA_DEF_T1_TO_T5() typename T1, typename T2, typename T3, typename T4, typename T5
00051 #define ACEDIA_DEF_T1_TO_T6() typename T1, typename T2, typename T3, typename T4, typename T5, typename T6
00052 #define ACEDIA_DEF_T1_TO_T7() typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7
00053 #define ACEDIA_DEF_T1_TO_T8() typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8
00054 #define ACEDIA_DEF_T1_TO_T9() typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9
00055 #define ACEDIA_DEF_T1_TO_T10() typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10
00056 #define ACEDIA_DEF_T1_TO_TX(n) BOOST_PP_CAT(ACEDIA_DEF_T1_TO_T,n)()
00057
00058 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T1() typename T1 = Unit
00059 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T2() typename T1 = Unit, typename T2 = Unit
00060 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T3() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit
00061 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T4() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit
00062 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T5() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit
00063 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T6() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit, typename T6 = Unit
00064 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T7() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit, typename T6 = Unit, typename T7 = Unit
00065 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T8() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit, typename T6 = Unit, typename T7 = Unit, typename T8 = Unit
00066 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T9() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit, typename T6 = Unit, typename T7 = Unit, typename T8 = Unit, typename T9 = Unit
00067 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_T10() typename T1 = Unit, typename T2 = Unit, typename T3 = Unit, typename T4 = Unit, typename T5 = Unit, typename T6 = Unit, typename T7 = Unit, typename T8 = Unit, typename T9 = Unit, typename T10 = Unit
00068 #define ACEDIA_DEF_WITH_DEFAULT_T1_TO_TX(n) BOOST_PP_CAT(ACEDIA_DEF_WITH_DEFAULT_T1_TO_T,n)()
00069
00070 #define ACEDIA_GET_T1_TO_T1() T1
00071 #define ACEDIA_GET_T1_TO_T2() T1,T2
00072 #define ACEDIA_GET_T1_TO_T3() T1,T2,T3
00073 #define ACEDIA_GET_T1_TO_T4() T1,T2,T3,T4
00074 #define ACEDIA_GET_T1_TO_T5() T1,T2,T3,T4,T5
00075 #define ACEDIA_GET_T1_TO_T6() T1,T2,T3,T4,T5,T6
00076 #define ACEDIA_GET_T1_TO_T7() T1,T2,T3,T4,T5,T6,T7
00077 #define ACEDIA_GET_T1_TO_T8() T1,T2,T3,T4,T5,T6,T7,T8
00078 #define ACEDIA_GET_T1_TO_T9() T1,T2,T3,T4,T5,T6,T7,T8,T9
00079 #define ACEDIA_GET_T1_TO_T10() T1,T2,T3,T4,T5,T6,T7,T8,T9,T10
00080 #define ACEDIA_GET_T1_TO_TX(n) BOOST_PP_CAT(ACEDIA_GET_T1_TO_T,n)()
00081
00082 #define ACEDIA_GET_V1_TO_V1() v1
00083 #define ACEDIA_GET_V1_TO_V2() v1,v2
00084 #define ACEDIA_GET_V1_TO_V3() v1,v2,v3
00085 #define ACEDIA_GET_V1_TO_V4() v1,v2,v3,v4
00086 #define ACEDIA_GET_V1_TO_V5() v1,v2,v3,v4,v5
00087 #define ACEDIA_GET_V1_TO_V6() v1,v2,v3,v4,v5,v6
00088 #define ACEDIA_GET_V1_TO_V7() v1,v2,v3,v4,v5,v6,v7
00089 #define ACEDIA_GET_V1_TO_V8() v1,v2,v3,v4,v5,v6,v7,v8
00090 #define ACEDIA_GET_V1_TO_V9() v1,v2,v3,v4,v5,v6,v7,v8,v9
00091 #define ACEDIA_GET_V1_TO_VX(n) BOOST_PP_CAT(ACEDIA_GET_V1_TO_V,n)()
00092
00093 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_1() const T1 &v1
00094 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_2() const T1 &v1, const T2 &v2
00095 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_3() const T1 &v1, const T2 &v2, const T3 &v3
00096 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_4() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4
00097 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_5() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5
00098 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_6() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6
00099 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_7() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7
00100 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_8() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7, const T8 &v8
00101 #define ACEDIA_GET_T1_TO_TX_ARG_LIST_9() const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5, const T6 &v6, const T7 &v7, const T8 &v8, const T9 &v9
00102 #define ACEDIA_GET_T1_TO_TX_ARG_LIST(n) BOOST_PP_CAT(ACEDIA_GET_T1_TO_TX_ARG_LIST_,n)()
00103
00104 #define ACEDIA_ARG_LIST_FIRST_1(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1
00105 #define ACEDIA_ARG_LIST_FIRST_2(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2
00106 #define ACEDIA_ARG_LIST_FIRST_3(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3
00107 #define ACEDIA_ARG_LIST_FIRST_4(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4
00108 #define ACEDIA_ARG_LIST_FIRST_5(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4, const mt5 &v5
00109 #define ACEDIA_ARG_LIST_FIRST_6(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4, const mt5 &v5, const mt6 &v6
00110 #define ACEDIA_ARG_LIST_FIRST_7(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4, const mt5 &v5, const mt6 &v6, const mt7 &v7
00111 #define ACEDIA_ARG_LIST_FIRST_8(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4, const mt5 &v5, const mt6 &v6, const mt7 &v7, const mt8 &v8
00112 #define ACEDIA_ARG_LIST_FIRST_9(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) const mt1 &v1, const mt2 &v2, const mt3 &v3, const mt4 &v4, const mt5 &v5, const mt6 &v6, const mt7 &v7, const mt8 &v8, const mt9 &v9
00113 #define ACEDIA_ARG_LIST_FIRST_N(N, mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) BOOST_PP_CAT(ACEDIA_ARG_LIST_FIRST_,N)(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9)
00114
00115 #define ACEDIA_FIRST_1(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1
00116 #define ACEDIA_FIRST_2(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2
00117 #define ACEDIA_FIRST_3(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3
00118 #define ACEDIA_FIRST_4(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4
00119 #define ACEDIA_FIRST_5(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4 , mt5
00120 #define ACEDIA_FIRST_6(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4 , mt5 , mt6
00121 #define ACEDIA_FIRST_7(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4 , mt5 , mt6 , mt7
00122 #define ACEDIA_FIRST_8(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4 , mt5 , mt6 , mt7 , mt8
00123 #define ACEDIA_FIRST_9(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) mt1 , mt2 , mt3 , mt4 , mt5 , mt6 , mt7 , mt8 , mt9
00124 #define ACEDIA_FIRST_N(N, mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) BOOST_PP_CAT(ACEDIA_FIRST_,N)(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9)
00125
00126 #define ACEDIA_TYPEDEF_FIRST_1(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1;
00127 #define ACEDIA_TYPEDEF_FIRST_2(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ;
00128 #define ACEDIA_TYPEDEF_FIRST_3(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ;
00129 #define ACEDIA_TYPEDEF_FIRST_4(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ;
00130 #define ACEDIA_TYPEDEF_FIRST_5(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ; typedef mt5 T5 ;
00131 #define ACEDIA_TYPEDEF_FIRST_6(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ; typedef mt5 T5 ; typedef mt6 T6 ;
00132 #define ACEDIA_TYPEDEF_FIRST_7(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ; typedef mt5 T5 ; typedef mt6 T6 ; typedef mt7 T7 ;
00133 #define ACEDIA_TYPEDEF_FIRST_8(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ; typedef mt5 T5 ; typedef mt6 T6 ; typedef mt7 T7 ; typedef mt8 T8 ;
00134 #define ACEDIA_TYPEDEF_FIRST_9(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) typedef mt1 T1; typedef mt2 T2 ; typedef mt3 T3 ; typedef mt4 T4 ; typedef mt5 T5 ; typedef mt6 T6 ; typedef mt7 T7 ; typedef mt8 T8 ; typedef mt9 T9;
00135 #define ACEDIA_TYPEDEF_FIRST_N(N, mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9) BOOST_PP_CAT(ACEDIA_TYPEDEF_FIRST_,N)(mt1, mt2, mt3, mt4, mt5, mt6, mt7, mt8, mt9)
00136
00137 #define ACEDIA_OPEN_NAMESPACES_BY(seq) BOOST_PP_SEQ_FOR_EACH(ACEDIA_BUILD_NAMESPACES_SINGLE,BOOST_PP_EMPTY(),BOOST_PP_SEQ_POP_BACK(seq))
00138 #define ACEDIA_SEQ_LAST(seq) BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_REVERSE(seq))
00139
00140 #define ACEDIA_DLINES_IMPLODE1(SEQ) BOOST_PP_EMPTY()
00141 #define ACEDIA_DLINES_IMPLODE2(SEQ) BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ))
00142 #define ACEDIA_DLINES_IMPLODE3(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE2(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00143 #define ACEDIA_DLINES_IMPLODE4(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE3(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00144 #define ACEDIA_DLINES_IMPLODE5(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE4(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00145 #define ACEDIA_DLINES_IMPLODE6(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE5(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00146 #define ACEDIA_DLINES_IMPLODE7(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE6(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00147 #define ACEDIA_DLINES_IMPLODE8(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE7(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00148 #define ACEDIA_DLINES_IMPLODE9(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),ACEDIA_DLINES_IMPLODE8(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00149 #define ACEDIA_DLINES_IMPLODE(SEQ) BOOST_PP_CAT(BOOST_PP_CAT(__,BOOST_PP_SEQ_ELEM(0,SEQ)),BOOST_PP_CAT(ACEDIA_DLINES_IMPLODE,BOOST_PP_SEQ_SIZE(SEQ))(BOOST_PP_SEQ_POP_FRONT(SEQ)))
00150
00151 #define ACEDIA_PUSH_DDOT(r, data, elem) :: elem
00152
00153 #define ACEDIA_PUSH(r, data, elem) BOOST_PP_CAT(data,elem)
00154
00155 #define ACEDIA_PUSH_DDOTS(SEQ) BOOST_PP_SEQ_ELEM(0, SEQ) BOOST_PP_SEQ_FOR_EACH(ACEDIA_PUSH_DDOT,_,BOOST_PP_SEQ_POP_FRONT(SEQ))
00156
00157 #define ACEDIA_PUSH_DLINES(SEQ) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0,SEQ),ACEDIA_DLINES_IMPLODE(SEQ))
00158
00159 #define ACEDIA_REDUCE_SEQ(HOW,SEQ) BOOST_PP_IF(BOOST_PP_SUB(BOOST_PP_SEQ_SIZE(SEQ),1),HOW(SEQ),BOOST_PP_SEQ_ELEM(0,SEQ))
00160
00161 #define ACEDIA_EVAL2(FUNC,ARG1,ARG2) FUNC(ARG1,ARG2)
00162
00163 #define ACEDIA_EVAL3(FUNC,ARG1,ARG2,ARG3) FUNC(ARG1,ARG2,ARG3)
00164
00165 #define ACEDIA_CLASS_NAME(class_name_seq) ACEDIA_REDUCE_SEQ(ACEDIA_PUSH_DDOTS,class_name_seq)
00166
00167
00168 #define ACEDIA_MSG_SUBMATCH(unusedR, unusedData, pos, anyType) BOOST_PP_IF( pos , && , BOOST_PP_EMPTY() ) singleMatch< anyType >( at( pos ) )
00169
00170 #define ACEDIA_BUILD_NAMESPACES_SINGLE(r, data, elem) namespace elem {
00171 #define ACEDIA_BUILD_NAMESPACES(namespaces_seq) BOOST_PP_SEQ_FOR_EACH(ACEDIA_BUILD_NAMESPACES_SINGLE, _, namespaces_seq)
00172 #define ACEDIA_CLOSE_NAMESPACES_SINGLE(r, data, elem) }
00173 #define ACEDIA_CLOSE_NAMESPACES(namespaces_seq) BOOST_PP_SEQ_FOR_EACH(ACEDIA_CLOSE_NAMESPACES_SINGLE, _, namespaces_seq)
00174
00175 #define ACEDIA_NAMED_GETTER(x, mt, an) \
00176 inline const mt & an () const { return get< x >(); }
00177
00178 #define ACEDIA_NAMED_GETTER_IF(x, elem_id, mt, an) \
00179 BOOST_PP_IF(BOOST_PP_LESS(elem_id, x), ACEDIA_NAMED_GETTER(elem_id, mt, an), BOOST_PP_EMPTY())
00180
00181 #endif // ACEDIA_PREPROCESSOR_H