annotate DEPENDENCIES/generic/include/boost/local_function/aux_/function.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1
Chris@16 2 // Copyright (C) 2009-2012 Lorenzo Caminiti
Chris@16 3 // Distributed under the Boost Software License, Version 1.0
Chris@16 4 // (see accompanying file LICENSE_1_0.txt or a copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6 // Home at http://www.boost.org/libs/local_function
Chris@16 7
Chris@16 8 #if !BOOST_PP_IS_ITERATING
Chris@16 9 # ifndef BOOST_LOCAL_FUNCTION_AUX_FUNCTION_HPP_
Chris@16 10 # define BOOST_LOCAL_FUNCTION_AUX_FUNCTION_HPP_
Chris@16 11
Chris@16 12 # include <boost/local_function/config.hpp>
Chris@16 13 # include <boost/local_function/aux_/member.hpp>
Chris@16 14 # include <boost/call_traits.hpp>
Chris@16 15 # include <boost/typeof/typeof.hpp>
Chris@16 16 # include <boost/config.hpp>
Chris@16 17 # include <boost/preprocessor/iteration/iterate.hpp>
Chris@16 18 # include <boost/preprocessor/repetition/repeat.hpp>
Chris@16 19 # include <boost/preprocessor/repetition/enum.hpp>
Chris@16 20 # include <boost/preprocessor/punctuation/comma_if.hpp>
Chris@16 21 # include <boost/preprocessor/arithmetic/add.hpp>
Chris@16 22 # include <boost/preprocessor/arithmetic/sub.hpp>
Chris@16 23 # include <boost/preprocessor/arithmetic/inc.hpp>
Chris@16 24 # include <boost/preprocessor/control/iif.hpp>
Chris@16 25 # include <boost/preprocessor/cat.hpp>
Chris@16 26
Chris@16 27 // PRIVATE //
Chris@16 28
Chris@16 29 #define BOOST_LOCAL_FUNCTION_AUX_FUNCTION_THIS_FILE_ \
Chris@16 30 "boost/local_function/aux_/function.hpp"
Chris@16 31
Chris@16 32 // PUBLIC //
Chris@16 33
Chris@16 34 #define BOOST_LOCAL_FUNCTION_AUX_FUNCTION_INIT_CALL_FUNC \
Chris@16 35 BOOST_LOCAL_FUNCTION_AUX_SYMBOL( (init_call) )
Chris@16 36
Chris@16 37 #define BOOST_LOCAL_FUNCTION_AUX_typename_seq(z, n, unused) \
Chris@16 38 (typename)
Chris@16 39
Chris@16 40 #define BOOST_LOCAL_FUNCTION_AUX_arg_type(z, arg_n, unused) \
Chris@16 41 BOOST_PP_CAT(Arg, arg_n)
Chris@16 42
Chris@16 43 #define BOOST_LOCAL_FUNCTION_AUX_arg_typedef(z, arg_n, unused) \
Chris@16 44 typedef \
Chris@16 45 BOOST_LOCAL_FUNCTION_AUX_arg_type(z, arg_n, ~) \
Chris@16 46 /* name must follow Boost.FunctionTraits arg1_type, arg2_type, ... */ \
Chris@16 47 BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(arg_n)), _type) \
Chris@16 48 ;
Chris@16 49
Chris@16 50 #define BOOST_LOCAL_FUNCTION_AUX_comma_arg_tparam(z, arg_n, unused) \
Chris@16 51 , typename BOOST_LOCAL_FUNCTION_AUX_arg_type(z, arg_n, ~)
Chris@16 52
Chris@16 53 #define BOOST_LOCAL_FUNCTION_AUX_arg_param_type(z, arg_n, comma01) \
Chris@16 54 BOOST_PP_COMMA_IF(comma01) \
Chris@16 55 typename ::boost::call_traits< \
Chris@16 56 BOOST_LOCAL_FUNCTION_AUX_arg_type(z, arg_n, ~) \
Chris@16 57 >::param_type
Chris@16 58
Chris@16 59 #define BOOST_LOCAL_FUNCTION_AUX_arg_name(z, arg_n, comma01) \
Chris@16 60 BOOST_PP_COMMA_IF(comma01) \
Chris@16 61 BOOST_PP_CAT(arg, arg_n)
Chris@16 62
Chris@16 63 #define BOOST_LOCAL_FUNCTION_AUX_arg_param_decl(z, arg_n, unused) \
Chris@16 64 BOOST_LOCAL_FUNCTION_AUX_arg_param_type(z, arg_n, 0 /* no leading comma */)\
Chris@16 65 BOOST_LOCAL_FUNCTION_AUX_arg_name(z, arg_n, 0 /* no leading comma */)
Chris@16 66
Chris@16 67 #define BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, unused) \
Chris@16 68 BOOST_PP_CAT(Bind, bind_n)
Chris@16 69
Chris@16 70 #define BOOST_LOCAL_FUNCTION_AUX_comma_bind_type(z, bind_n, unused) \
Chris@16 71 , BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~)
Chris@16 72
Chris@16 73 #define BOOST_LOCAL_FUNCTION_AUX_comma_bind_ref(z, bind_n, unused) \
Chris@16 74 , BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~) &
Chris@16 75
Chris@16 76 #define BOOST_LOCAL_FUNCTION_AUX_comma_bind_tparam(z, bind_n, unused) \
Chris@16 77 , typename BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~)
Chris@16 78
Chris@16 79 #define BOOST_LOCAL_FUNCTION_AUX_bind_name(z, bind_n, unused) \
Chris@16 80 BOOST_PP_CAT(bing, bind_n)
Chris@16 81
Chris@16 82 #define BOOST_LOCAL_FUNCTION_AUX_comma_bind_param_decl(z, bind_n, unused) \
Chris@16 83 , \
Chris@16 84 BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~) & \
Chris@16 85 BOOST_LOCAL_FUNCTION_AUX_bind_name(z, bind_n, ~)
Chris@16 86
Chris@16 87 #define BOOST_LOCAL_FUNCTION_AUX_bind_member(z, bind_n, unsued) \
Chris@16 88 BOOST_PP_CAT(BOOST_LOCAL_FUNCTION_AUX_bind_name(z, bind_n, ~), _)
Chris@16 89
Chris@16 90 #define BOOST_LOCAL_FUNCTION_AUX_comma_bind_member_deref(z, bind_n, unsued) \
Chris@16 91 , member_deref< BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~) >( \
Chris@16 92 BOOST_LOCAL_FUNCTION_AUX_bind_member(z, bind_n, ~))
Chris@16 93
Chris@16 94 #define BOOST_LOCAL_FUNCTION_AUX_bind_member_init(z, bind_n, unused) \
Chris@16 95 BOOST_LOCAL_FUNCTION_AUX_bind_member(z, bind_n, ~) = member_addr( \
Chris@16 96 BOOST_LOCAL_FUNCTION_AUX_bind_name(z, bind_n, ~));
Chris@16 97
Chris@16 98 #define BOOST_LOCAL_FUNCTION_AUX_bind_member_decl(z, bind_n, unused) \
Chris@16 99 /* must be ptr (not ref) so can use default constr */ \
Chris@16 100 typename member_type< \
Chris@16 101 BOOST_LOCAL_FUNCTION_AUX_bind_type(z, bind_n, ~) \
Chris@16 102 >::pointer BOOST_LOCAL_FUNCTION_AUX_bind_member(z, bind_n, ~) ;
Chris@16 103
Chris@16 104 #define BOOST_LOCAL_FUNCTION_AUX_call_ptr(z, n, unused) \
Chris@16 105 BOOST_PP_CAT(call_ptr, n)
Chris@16 106
Chris@16 107 #define BOOST_LOCAL_FUNCTION_AUX_call_name(z, n, unused) \
Chris@16 108 BOOST_PP_CAT(call, n)
Chris@16 109
Chris@16 110 #define BOOST_LOCAL_FUNCTION_AUX_call_member(z, n, unused) \
Chris@16 111 BOOST_PP_CAT(BOOST_LOCAL_FUNCTION_AUX_call_name(z, n, unused), _)
Chris@16 112
Chris@16 113 #define BOOST_LOCAL_FUNCTION_AUX_call_typedef(z, n, arity) \
Chris@16 114 typedef R (*BOOST_LOCAL_FUNCTION_AUX_call_ptr(z, n, ~))( \
Chris@16 115 object_ptr \
Chris@16 116 BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS, \
Chris@16 117 BOOST_PP_TUPLE_EAT(3) \
Chris@16 118 , \
Chris@16 119 BOOST_PP_REPEAT_ ## z \
Chris@16 120 )(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX, \
Chris@16 121 BOOST_LOCAL_FUNCTION_AUX_comma_bind_ref, ~) \
Chris@16 122 BOOST_PP_REPEAT_ ## z(BOOST_PP_SUB(arity, n), \
Chris@16 123 BOOST_LOCAL_FUNCTION_AUX_arg_param_type, 1 /* leading comma */)\
Chris@16 124 );
Chris@16 125
Chris@16 126 #define BOOST_LOCAL_FUNCTION_AUX_comma_call_param_decl(z, n, unused) \
Chris@16 127 , \
Chris@16 128 BOOST_LOCAL_FUNCTION_AUX_call_ptr(z, n, ~) \
Chris@16 129 BOOST_LOCAL_FUNCTION_AUX_call_name(z, n, ~)
Chris@16 130
Chris@16 131 #define BOOST_LOCAL_FUNCTION_AUX_call_decl(z, n, unused) \
Chris@16 132 BOOST_LOCAL_FUNCTION_AUX_call_ptr(z, n, ~) \
Chris@16 133 BOOST_LOCAL_FUNCTION_AUX_call_member(z, n, ~);
Chris@16 134
Chris@16 135 #define BOOST_LOCAL_FUNCTION_AUX_call_init(z, n, unused) \
Chris@16 136 BOOST_LOCAL_FUNCTION_AUX_call_member(z, n, ~) = \
Chris@16 137 BOOST_LOCAL_FUNCTION_AUX_call_name(z, n, ~);
Chris@16 138
Chris@16 139 #define BOOST_LOCAL_FUNCTION_AUX_operator_call(z, defaults_n, arity) \
Chris@16 140 /* precondition: object_ && call_function_ */ \
Chris@16 141 inline R operator()( \
Chris@16 142 BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
Chris@16 143 BOOST_LOCAL_FUNCTION_AUX_arg_param_decl, ~) \
Chris@16 144 ) /* cannot be const because of binds (same as for local ftor) */ { \
Chris@16 145 /* run-time: do not assert preconditions here for efficiency */ \
Chris@16 146 /* run-time: this function call is done via a function pointer */ \
Chris@16 147 /* so unfortunately does not allow for compiler inlining */ \
Chris@16 148 /* optimizations (an alternative using virtual function was also */ \
Chris@16 149 /* investigated but also virtual functions cannot be optimized */ \
Chris@16 150 /* plus they require virtual table lookups to the alternative */ \
Chris@16 151 /* performed worst) */ \
Chris@16 152 return BOOST_LOCAL_FUNCTION_AUX_call_member(z, defaults_n, ~)( \
Chris@16 153 object_ \
Chris@16 154 BOOST_PP_IIF( \
Chris@16 155 BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS,\
Chris@16 156 BOOST_PP_TUPLE_EAT(3) \
Chris@16 157 , \
Chris@16 158 BOOST_PP_REPEAT_ ## z \
Chris@16 159 )(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX, \
Chris@16 160 BOOST_LOCAL_FUNCTION_AUX_comma_bind_member_deref, ~) \
Chris@16 161 BOOST_PP_REPEAT_ ## z(BOOST_PP_SUB(arity, defaults_n), \
Chris@16 162 BOOST_LOCAL_FUNCTION_AUX_arg_name, 1 /* leading comma */) \
Chris@16 163 ); \
Chris@16 164 }
Chris@16 165
Chris@16 166 namespace boost { namespace local_function { namespace aux {
Chris@16 167
Chris@16 168 template<
Chris@16 169 typename F
Chris@16 170 , size_t defaults
Chris@16 171 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 172 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 173 BOOST_LOCAL_FUNCTION_AUX_comma_bind_tparam, ~)
Chris@16 174 #endif
Chris@16 175 >
Chris@16 176 class function {}; // Empty template, only use its specializations.
Chris@16 177
Chris@16 178 // Iterate within namespace.
Chris@16 179 # define BOOST_PP_ITERATION_PARAMS_1 \
Chris@16 180 (3, (0, BOOST_LOCAL_FUNCTION_CONFIG_FUNCTION_ARITY_MAX, \
Chris@16 181 BOOST_LOCAL_FUNCTION_AUX_FUNCTION_THIS_FILE_))
Chris@16 182 # include BOOST_PP_ITERATE() // Iterate over function arity.
Chris@16 183
Chris@16 184 } } } // namespace
Chris@16 185
Chris@16 186 // Register type for type-of emu (NAME use TYPEOF to deduce this fctor type).
Chris@16 187 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
Chris@16 188 BOOST_TYPEOF_REGISTER_TEMPLATE(boost::local_function::aux::function,
Chris@16 189 (typename) // For `F` tparam.
Chris@16 190 (size_t) // For `defaults` tparam.
Chris@16 191 // MSVC error if using #if instead of PP_IIF here.
Chris@16 192 BOOST_PP_IIF(BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS,
Chris@16 193 BOOST_PP_TUPLE_EAT(3) // Nothing.
Chris@16 194 ,
Chris@16 195 BOOST_PP_REPEAT // For bind tparams.
Chris@16 196 )(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 197 BOOST_LOCAL_FUNCTION_AUX_typename_seq, ~)
Chris@16 198 )
Chris@16 199
Chris@16 200 #undef BOOST_LOCAL_FUNCTION_AUX_typename_seq
Chris@16 201 #undef BOOST_LOCAL_FUNCTION_AUX_arg_type
Chris@16 202 #undef BOOST_LOCAL_FUNCTION_AUX_arg_typedef
Chris@16 203 #undef BOOST_LOCAL_FUNCTION_AUX_comma_arg_tparam
Chris@16 204 #undef BOOST_LOCAL_FUNCTION_AUX_arg_param_type
Chris@16 205 #undef BOOST_LOCAL_FUNCTION_AUX_arg_name
Chris@16 206 #undef BOOST_LOCAL_FUNCTION_AUX_arg_param_decl
Chris@16 207 #undef BOOST_LOCAL_FUNCTION_AUX_bind_type
Chris@16 208 #undef BOOST_LOCAL_FUNCTION_AUX_comma_bind_type
Chris@16 209 #undef BOOST_LOCAL_FUNCTION_AUX_comma_bind_ref
Chris@16 210 #undef BOOST_LOCAL_FUNCTION_AUX_comma_bind_tparam
Chris@16 211 #undef BOOST_LOCAL_FUNCTION_AUX_bind_name
Chris@16 212 #undef BOOST_LOCAL_FUNCTION_AUX_comma_bind_param_decl
Chris@16 213 #undef BOOST_LOCAL_FUNCTION_AUX_bind_member
Chris@16 214 #undef BOOST_LOCAL_FUNCTION_AUX_comma_bind_member_deref
Chris@16 215 #undef BOOST_LOCAL_FUNCTION_AUX_bind_member_init
Chris@16 216 #undef BOOST_LOCAL_FUNCTION_AUX_bind_member_decl
Chris@16 217 #undef BOOST_LOCAL_FUNCTION_AUX_call_ptr
Chris@16 218 #undef BOOST_LOCAL_FUNCTION_AUX_call_name
Chris@16 219 #undef BOOST_LOCAL_FUNCTION_AUX_call_member
Chris@16 220 #undef BOOST_LOCAL_FUNCTION_AUX_call_typedef
Chris@16 221 #undef BOOST_LOCAL_FUNCTION_AUX_comma_call_param_decl
Chris@16 222 #undef BOOST_LOCAL_FUNCTION_AUX_call_decl
Chris@16 223 #undef BOOST_LOCAL_FUNCTION_AUX_call_init
Chris@16 224 #undef BOOST_LOCAL_FUNCTION_AUX_operator_call
Chris@16 225
Chris@16 226 # endif // #include guard
Chris@16 227
Chris@16 228 #elif BOOST_PP_ITERATION_DEPTH() == 1
Chris@16 229 # define BOOST_LOCAL_FUNCTION_AUX_arity BOOST_PP_FRAME_ITERATION(1)
Chris@16 230 # define BOOST_PP_ITERATION_PARAMS_2 \
Chris@16 231 (3, (0, BOOST_LOCAL_FUNCTION_AUX_arity, \
Chris@16 232 BOOST_LOCAL_FUNCTION_AUX_FUNCTION_THIS_FILE_))
Chris@16 233 # include BOOST_PP_ITERATE() // Iterate over default params count.
Chris@16 234 # undef BOOST_LOCAL_FUNCTION_AUX_arity
Chris@16 235
Chris@16 236 #elif BOOST_PP_ITERATION_DEPTH() == 2
Chris@16 237 # define BOOST_LOCAL_FUNCTION_AUX_defaults BOOST_PP_FRAME_ITERATION(2)
Chris@16 238
Chris@16 239 template<
Chris@16 240 typename R
Chris@16 241 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_AUX_arity,
Chris@16 242 BOOST_LOCAL_FUNCTION_AUX_comma_arg_tparam, ~)
Chris@16 243 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 244 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 245 BOOST_LOCAL_FUNCTION_AUX_comma_bind_tparam, ~)
Chris@16 246 #endif
Chris@16 247 >
Chris@16 248 class function<
Chris@16 249 R (
Chris@16 250 BOOST_PP_ENUM(BOOST_LOCAL_FUNCTION_AUX_arity,
Chris@16 251 BOOST_LOCAL_FUNCTION_AUX_arg_type, ~)
Chris@16 252 )
Chris@16 253 , BOOST_LOCAL_FUNCTION_AUX_defaults
Chris@16 254 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 255 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 256 BOOST_LOCAL_FUNCTION_AUX_comma_bind_type, ~)
Chris@16 257 #endif
Chris@16 258 > {
Chris@16 259 // The object type will actually be a local class which cannot be passed as
Chris@16 260 // a template parameter so a generic `void*` pointer is used to hold the
Chris@16 261 // object (this pointer will then be cased by the call-function implemented
Chris@16 262 // by the local class itself). This is the trick used to pass a local
Chris@16 263 // function as a template parameter. This trick uses function pointers for
Chris@16 264 // the call-functions and function pointers cannot always be optimized by
Chris@16 265 // the compiler (they cannot be inlined) thus this trick increased run-time
Chris@16 266 // (another trick using virtual functions for the local class was also
Chris@16 267 // investigated but also virtual functions cannot be inlined plus they
Chris@16 268 // require virtual tables lookups so the virtual functions trick measured
Chris@16 269 // worst run-time performance than the function pointer trick).
Chris@16 270 typedef void* object_ptr;
Chris@16 271 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_AUX_defaults),
Chris@16 272 BOOST_LOCAL_FUNCTION_AUX_call_typedef, // INC for no defaults.
Chris@16 273 BOOST_LOCAL_FUNCTION_AUX_arity)
Chris@16 274
Chris@16 275 public:
Chris@16 276 // Provide public type interface following Boost.Function names
Chris@16 277 // (traits must be defined in both this and the local functor).
Chris@16 278 BOOST_STATIC_CONSTANT(size_t, arity = BOOST_LOCAL_FUNCTION_AUX_arity);
Chris@16 279 typedef R result_type;
Chris@16 280 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_AUX_arity,
Chris@16 281 BOOST_LOCAL_FUNCTION_AUX_arg_typedef, ~)
Chris@16 282
Chris@16 283 // NOTE: Must have default constructor for init without function name in
Chris@16 284 // function macro expansion.
Chris@16 285
Chris@16 286 // Cannot be private but it should never be used by programmers directly
Chris@16 287 // so used internal symbol.
Chris@16 288 inline void BOOST_LOCAL_FUNCTION_AUX_FUNCTION_INIT_CALL_FUNC(
Chris@16 289 object_ptr object
Chris@16 290 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 291 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 292 BOOST_LOCAL_FUNCTION_AUX_comma_bind_param_decl, ~)
Chris@16 293 #endif
Chris@16 294 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_AUX_defaults),
Chris@16 295 BOOST_LOCAL_FUNCTION_AUX_comma_call_param_decl, ~)
Chris@16 296 ) {
Chris@16 297 object_ = object;
Chris@16 298 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 299 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 300 BOOST_LOCAL_FUNCTION_AUX_bind_member_init, ~)
Chris@16 301 #endif
Chris@16 302 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_AUX_defaults),
Chris@16 303 BOOST_LOCAL_FUNCTION_AUX_call_init, ~) // INC for no defaults.
Chris@16 304 unused_ = 0; // To avoid a GCC uninitialized warning.
Chris@16 305 }
Chris@16 306
Chris@16 307 // Result operator(Arg1, ..., ArgN-1, ArgN) -- iff defaults >= 0
Chris@16 308 // Result operator(Arg1, ..., ArgN-1) -- iff defaults >= 1
Chris@16 309 // ... -- etc
Chris@16 310 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_AUX_defaults),
Chris@16 311 BOOST_LOCAL_FUNCTION_AUX_operator_call, // INC for no defaults.
Chris@16 312 BOOST_LOCAL_FUNCTION_AUX_arity)
Chris@16 313
Chris@16 314 private:
Chris@16 315 object_ptr object_;
Chris@16 316 #if !BOOST_LOCAL_FUNCTION_CONFIG_LOCALS_AS_TPARAMS
Chris@16 317 BOOST_PP_REPEAT(BOOST_LOCAL_FUNCTION_CONFIG_BIND_MAX,
Chris@16 318 BOOST_LOCAL_FUNCTION_AUX_bind_member_decl, ~)
Chris@16 319 #endif
Chris@16 320 BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_FUNCTION_AUX_defaults),
Chris@16 321 BOOST_LOCAL_FUNCTION_AUX_call_decl, ~) // INC for no defaults.
Chris@16 322
Chris@16 323 // run-time: this unused void* member variable allows for compiler
Chris@16 324 // optimizations (at least on MSVC it reduces invocation time of about 50%)
Chris@16 325 void* unused_;
Chris@16 326 };
Chris@16 327
Chris@16 328 # undef BOOST_LOCAL_FUNCTION_AUX_defaults
Chris@16 329 #endif // iteration
Chris@16 330