00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_Utils_mpl_
00027 #define HH_SENF_Utils_mpl_ 1
00028
00029
00030 #include <senf/config.hh>
00031
00032
00033 #include "mpl.ih"
00034
00035
00036 namespace senf {
00037 namespace mpl {
00038
00050 struct nil {};
00051
00115 template <unsigned n>
00116 struct rv {
00117 char _[SENF_MPL_RV_ALIGNMENT][n+1];
00118 };
00119
00128 # define SENF_MPL_RV(expr) (sizeof(expr)/SENF_MPL_RV_ALIGNMENT-1)
00129
00138 template <unsigned long _> struct take_uint {};
00139
00148 template <long _> struct take_int {};
00149
00157 template <class _> struct take_class {};
00158
00159 #ifndef SENF_MPL_SLOT_NOEXPAND
00160
00192 # define SENF_MPL_SLOT_DEF(name,value) \
00193 template <class _> \
00194 static senf::mpl::rv<0> _SENF_MPL_SLOT_ ## name (_); \
00195 SENF_MPL_SLOT_SET(name,value)
00196
00204 # define SENF_MPL_SLOT_DEF_ZERO(name) \
00205 template <class _> \
00206 static senf::mpl::rv<0> _SENF_MPL_SLOT_ ## name (_);
00207
00213 # define SENF_MPL_SLOT_SET(name,value) \
00214 static senf::mpl::rv<unsigned(value)+1> \
00215 _SENF_MPL_SLOT_ ## name (senf::mpl::take_int<__LINE__>)
00216
00222 # define SENF_MPL_SLOT_GET(name) \
00223 SENF_MPL_SLOT_I_GET(name)
00224
00225 #endif
00226
00227 }}
00228
00229
00230
00231
00232
00233 #endif
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244