|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r76352 - in sandbox/closure: . boost boost/closure boost/closure/aux_ boost/closure/aux_/macro/code_ boost/closure/aux_/preprocessor/traits/decl_sign_ libs/closure/example
From: lorcaminiti_at_[hidden]
Date: 2012-01-07 18:43:23
Author: lcaminiti
Date: 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
New Revision: 76352
URL: http://svn.boost.org/trac/boost/changeset/76352
Log:
Compiled returning example.
Added:
sandbox/closure/Jamroot.v2
- copied, changed from r76071, /sandbox/closure/Jamroot.jam
Removed:
sandbox/closure/Jamroot.jam
Text files modified:
sandbox/closure/Jamroot.v2 | 28 -
sandbox/closure/boost/closure/aux_/function.hpp | 170 ++++++++++---
sandbox/closure/boost/closure/aux_/macro/code_/end.hpp | 4
sandbox/closure/boost/closure/aux_/macro/code_/functor.hpp | 505 +++++++++++++++++++++++++++++----------
sandbox/closure/boost/closure/aux_/macro/code_/result.hpp | 6
sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/sign.hpp | 6
sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/validate.hpp | 14 +
sandbox/closure/boost/closure/config.hpp | 10
sandbox/closure/boost/config_ext.hpp | 10
sandbox/closure/libs/closure/example/Jamfile.v2 | 5
sandbox/closure/libs/closure/example/profile_boost_closure.cpp | 6
sandbox/closure/libs/closure/example/profile_boost_phoenix.cpp | 4
12 files changed, 538 insertions(+), 230 deletions(-)
Deleted: sandbox/closure/Jamroot.jam
==============================================================================
--- sandbox/closure/Jamroot.jam 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
+++ (empty file)
@@ -1,33 +0,0 @@
-
-# Copyright (C) 2009-2011 Lorenzo Caminiti
-# Use, modification, and distribution is subject to the Boost Software
-# License, Version 1.0 (see accompanying file LICENSE_1_0.txt or a
-# copy at http://www.boost.org/LICENSE_1_0.txt).
-
-import os ;
-local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
-
-project
- : requirements
- <include>"." # For this library.
- <include>$(BOOST_ROOT) # For Boost libraries.
- ;
-
-# Boost.Chrono (which needs Boost.System) for GCC (not part of official Boost
-# release yet so assumed it was pre-built separately).
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono.so <target-os>linux ;
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono.a <target-os>cygwin ;
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono-vc80-mt-gd-1_47.lib
-# <target-os>windows ;
-# Boost.System as used to build Boost.Chrono.
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system.so <target-os>linux ;
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system.a <target-os>cygwin ;
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system-vc80-mt-gd-1_47.lib
-# <target-os>windows ;
-
Copied: sandbox/closure/Jamroot.v2 (from r76071, /sandbox/closure/Jamroot.jam)
==============================================================================
--- /sandbox/closure/Jamroot.jam (original)
+++ sandbox/closure/Jamroot.v2 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -7,27 +7,11 @@
import os ;
local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
-project
- : requirements
- <include>"." # For this library.
- <include>$(BOOST_ROOT) # For Boost libraries.
- ;
+use-project boost : $(BOOST_ROOT) ;
-# Boost.Chrono (which needs Boost.System) for GCC (not part of official Boost
-# release yet so assumed it was pre-built separately).
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono.so <target-os>linux ;
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono.a <target-os>cygwin ;
-#lib libboost_chrono :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_chrono-vc80-mt-gd-1_47.lib
-# <target-os>windows ;
-# Boost.System as used to build Boost.Chrono.
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system.so <target-os>linux ;
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system.a <target-os>cygwin ;
-#lib libboost_system :
-# : <file>$(BOOST_ROOT)/stage/lib/libboost_system-vc80-mt-gd-1_47.lib
-# <target-os>windows ;
+project : requirements
+ <include>"."
+ <include>$(BOOST_ROOT)
+ <define>BOOST_PP_VARIADICS # @todo remove this...
+;
Modified: sandbox/closure/boost/closure/aux_/function.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/function.hpp (original)
+++ sandbox/closure/boost/closure/aux_/function.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -8,7 +8,8 @@
# ifndef BOOST_CLOSURE_AUX_FUNCTION_HPP_
# define BOOST_CLOSURE_AUX_FUNCTION_HPP_
-# include <boost/closure/config.hpp>
+# include <boost/closure/aux_/config.hpp>
+# include <boost/closure/aux_/member.hpp>
# include <boost/call_traits.hpp>
# include <boost/preprocessor/iteration/iterate.hpp>
# include <boost/preprocessor/repetition/repeat.hpp>
@@ -31,20 +32,59 @@
#define BOOST_CLOSURE_AUX_arg_type(z, arg_n, unused) \
BOOST_PP_CAT(A, arg_n)
-#define BOOST_CLOSURE_AUX_arg_param_type(z, arg_n, unused) \
+#define BOOST_CLOSURE_AUX_comma_arg_tparam(z, arg_n, unused) \
+ , typename BOOST_CLOSURE_AUX_arg_type(z, arg_n, ~)
+
+#define BOOST_CLOSURE_AUX_arg_param_type(z, arg_n, comma01) \
+ BOOST_PP_COMMA_IF(comma01) \
typename ::boost::call_traits< \
- BOOST_CLOSURE_AUX_arg_type(z, arg_n, unused) \
+ BOOST_CLOSURE_AUX_arg_type(z, arg_n, ~) \
>::param_type
-#define BOOST_CLOSURE_AUX_arg_name(z, arg_n, unused) \
+#define BOOST_CLOSURE_AUX_arg_name(z, arg_n, comma01) \
+ BOOST_PP_COMMA_IF(comma01) \
BOOST_PP_CAT(a, arg_n)
-#define BOOST_CLOSURE_AUX_arg(z, arg_n, unused) \
- BOOST_CLOSURE_AUX_arg_param_type(z, arg_n, unused) \
- BOOST_CLOSURE_AUX_arg_name(z, arg_n, unused)
+#define BOOST_CLOSURE_AUX_arg_param_decl(z, arg_n, unused) \
+ BOOST_CLOSURE_AUX_arg_param_type(z, arg_n, 0 /* no leading comma */) \
+ BOOST_CLOSURE_AUX_arg_name(z, arg_n, 0 /* no leading comma */)
+
+#define BOOST_CLOSURE_AUX_bind_type(z, bind_n, unused) \
+ BOOST_PP_CAT(B, bind_n)
+
+#define BOOST_CLOSURE_AUX_comma_bind_type(z, bind_n, unused) \
+ , BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~)
+
+#define BOOST_CLOSURE_AUX_comma_bind_ref(z, bind_n, unused) \
+ , BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~) &
+
+#define BOOST_CLOSURE_AUX_comma_bind_tparam(z, bind_n, unused) \
+ , typename BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~)
+
+#define BOOST_CLOSURE_AUX_bind_name(z, bind_n, unused) \
+ BOOST_PP_CAT(b, bind_n)
-#define BOOST_CLOSURE_AUX_arg_tparam(z, arg_n, unused) \
- typename BOOST_CLOSURE_AUX_arg_type(z, arg_n, unused)
+#define BOOST_CLOSURE_AUX_comma_bind_param_decl(z, bind_n, unused) \
+ , \
+ BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~) & \
+ BOOST_CLOSURE_AUX_bind_name(z, bind_n, ~)
+
+#define BOOST_CLOSURE_AUX_bind_member(z, bind_n, unsued) \
+ BOOST_PP_CAT(BOOST_CLOSURE_AUX_bind_name(z, bind_n, ~), _)
+
+#define BOOST_CLOSURE_AUX_comma_bind_member_deref(z, bind_n, unsued) \
+ , member_deref<BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~)>( \
+ BOOST_CLOSURE_AUX_bind_member(z, bind_n, ~))
+
+#define BOOST_CLOSURE_AUX_bind_member_init(z, bind_n, unused) \
+ BOOST_CLOSURE_AUX_bind_member(z, bind_n, ~) = member_addr( \
+ BOOST_CLOSURE_AUX_bind_name(z, bind_n, ~));
+
+#define BOOST_CLOSURE_AUX_bind_member_decl(z, bind_n, unused) \
+ /* must be ptr (not ref) so can use default constr */ \
+ typename member_type< BOOST_CLOSURE_AUX_bind_type(z, bind_n, ~) >::pointer \
+ BOOST_CLOSURE_AUX_bind_member(z, bind_n, ~) \
+ ;
#define BOOST_CLOSURE_AUX_call_ptr(z, n, unused) \
BOOST_PP_CAT(call_ptr, n)
@@ -56,27 +96,37 @@
BOOST_PP_CAT(BOOST_CLOSURE_AUX_call_name(z, n, unused), _)
#define BOOST_CLOSURE_AUX_call_typedef(z, n, arity) \
- typedef R (*BOOST_CLOSURE_AUX_call_ptr(z, n, ~))(object_ptr \
- BOOST_PP_COMMA_IF(BOOST_PP_SUB(arity, n)) \
- BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, n), \
- BOOST_CLOSURE_AUX_arg_param_type, ~));
-
-#define BOOST_CLOSURE_AUX_call_param(z, n, unused) \
- BOOST_CLOSURE_AUX_call_ptr(z, n, unused) \
- BOOST_CLOSURE_AUX_call_name(z, n, unused)
+ typedef R (*BOOST_CLOSURE_AUX_call_ptr(z, n, ~))( \
+ object_ptr \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ BOOST_PP_REPEAT_ ## z \
+ )(BOOST_CLOSURE_CONFIG_BIND_MAX, BOOST_CLOSURE_AUX_comma_bind_ref, ~) \
+ BOOST_PP_REPEAT_ ## z(BOOST_PP_SUB(arity, n), \
+ BOOST_CLOSURE_AUX_arg_param_type, 1 /* leading comma */) \
+ );
+
+#define BOOST_CLOSURE_AUX_comma_call_param_decl(z, n, unused) \
+ , \
+ BOOST_CLOSURE_AUX_call_ptr(z, n, ~) \
+ BOOST_CLOSURE_AUX_call_name(z, n, ~)
#define BOOST_CLOSURE_AUX_call_decl(z, n, unused) \
- BOOST_CLOSURE_AUX_call_ptr(z, n, unused) \
- BOOST_CLOSURE_AUX_call_member(z, n, unused);
+ BOOST_CLOSURE_AUX_call_ptr(z, n, ~) \
+ BOOST_CLOSURE_AUX_call_member(z, n, ~);
#define BOOST_CLOSURE_AUX_call_init(z, n, unused) \
- BOOST_CLOSURE_AUX_call_member(z, n, unused) = \
- BOOST_CLOSURE_AUX_call_name(z, n, unuzed);
+ BOOST_CLOSURE_AUX_call_member(z, n, ~) = \
+ BOOST_CLOSURE_AUX_call_name(z, n, ~);
#define BOOST_CLOSURE_AUX_operator_call(z, defaults_n, arity) \
/* precondition: object_ && call_function_ */ \
- inline R operator()(BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
- BOOST_CLOSURE_AUX_arg, ~)) const { \
+ inline R operator()( \
+ BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
+ BOOST_CLOSURE_AUX_arg_param_decl, ~) \
+ ) /* cannot be const (because of binds) */ { \
/* run-time: do not assert preconditions here for efficiency */ \
/* run-time: this function call is done via a function pointer */ \
/* so unfortunately does not allow for compiler inlining */ \
@@ -84,15 +134,30 @@
/* investigated but also virtual functions cannot be optimized */ \
/* plus they require virtual table lookups to the alternative */ \
/* performed worst) */ \
- return BOOST_CLOSURE_AUX_call_member(z, defaults_n, ~)(object_ \
- BOOST_PP_COMMA_IF(BOOST_PP_SUB(arity, defaults_n)) \
- BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
- BOOST_CLOSURE_AUX_arg_name, ~)); \
+ return BOOST_CLOSURE_AUX_call_member(z, defaults_n, ~)( \
+ object_ \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01,\
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ BOOST_PP_REPEAT_ ## z \
+ )(BOOST_CLOSURE_CONFIG_BIND_MAX, \
+ BOOST_CLOSURE_AUX_comma_bind_member_deref, ~) \
+ BOOST_PP_REPEAT_ ## z(BOOST_PP_SUB(arity, defaults_n), \
+ BOOST_CLOSURE_AUX_arg_name, 1 /* leading comma */) \
+ ); \
}
-namespace boost { namespace local { namespace aux {
+namespace boost { namespace closure { namespace aux {
-template<typename F, size_t defaults = 0>
+template<
+ typename F
+ , size_t defaults
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_comma_bind_tparam, ~)
+#endif
+>
class function {
// Empty template cannot be used directly (only via its specializations).
};
@@ -105,11 +170,12 @@
}}} // namespace boost::loca::aux
+/** @todo undef all local macros */
#undef BOOST_CLOSURE_AUX_arg_type
#undef BOOST_CLOSURE_AUX_arg_param_type
#undef BOOST_CLOSURE_AUX_arg_name
-#undef BOOST_CLOSURE_AUX_arg
-#undef BOOST_CLOSURE_AUX_arg_tparam
+#undef BOOST_CLOSURE_AUX_arg_param_decl
+#undef BOOST_CLOSURE_AUX_comma_arg_tparam
#undef BOOST_CLOSURE_AUX_call_ptr
#undef BOOST_CLOSURE_AUX_call_name
#undef BOOST_CLOSURE_AUX_call_member
@@ -132,15 +198,23 @@
#elif BOOST_PP_ITERATION_DEPTH() == 2
# define BOOST_CLOSURE_AUX_defaults BOOST_PP_FRAME_ITERATION(2)
-// Iterating within namespce `boost::closure::aux`.
+// Iterating within namespace `boost::closure::aux`.
template<
typename R
- BOOST_PP_COMMA_IF(BOOST_CLOSURE_AUX_arity)
- BOOST_PP_ENUM(BOOST_CLOSURE_AUX_arity, BOOST_CLOSURE_AUX_arg_tparam, ~)
+ BOOST_PP_REPEAT(BOOST_CLOSURE_AUX_arity,
+ BOOST_CLOSURE_AUX_comma_arg_tparam, ~)
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_comma_bind_tparam, ~)
+#endif
>
class function<
R (BOOST_PP_ENUM(BOOST_CLOSURE_AUX_arity, BOOST_CLOSURE_AUX_arg_type, ~))
, BOOST_CLOSURE_AUX_defaults
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_comma_bind_type, ~)
+#endif
> {
// The object type will actually be a local class which cannot be passed as
// a template parameter so a generic `void*` pointer is used to hold the
@@ -156,20 +230,27 @@
typedef void* object_ptr;
BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_CLOSURE_AUX_defaults), // INC so no dflt.
BOOST_CLOSURE_AUX_call_typedef, BOOST_CLOSURE_AUX_arity)
+
public:
- // run-time: use compiler-generated default constructor, copy constructor,
- // and copy operator (this class only has pointers as member variables and
- // they only need to be copied shallowly so the compiler-generator
- // operations work well) to allow for compiler optimization
+ // NOTE: Must have default constructor for init without function name in
+ // function macro expansion.
// Cannot be private but it should never be used by programmers directly
// so used internal symbol.
inline void BOOST_CLOSURE_AUX_FUNCTION_INIT_CALL_FUNC(
- object_ptr object,
- BOOST_PP_ENUM(BOOST_PP_INC(BOOST_CLOSURE_AUX_defaults), // INC no dflt.
- BOOST_CLOSURE_AUX_call_param, ~)
+ object_ptr object
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_comma_bind_param_decl, ~)
+#endif
+ BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_CLOSURE_AUX_defaults),// INC no dflt.
+ BOOST_CLOSURE_AUX_comma_call_param_decl, ~)
) {
object_ = object;
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_bind_member_init, ~)
+#endif
BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_CLOSURE_AUX_defaults),
BOOST_CLOSURE_AUX_call_init, ~)
unused_ = 0; // To avoid a GCC uninitialized variable error.
@@ -183,12 +264,15 @@
private:
object_ptr object_;
+#if !BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+ BOOST_PP_REPEAT(BOOST_CLOSURE_CONFIG_BIND_MAX,
+ BOOST_CLOSURE_AUX_bind_member_decl, ~)
+#endif
BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_CLOSURE_AUX_defaults), // INC no dflt.
BOOST_CLOSURE_AUX_call_decl, ~)
-
// run-time: this unused void* member variable allows for compiler
// optimizations (at least on MSVC it reduces invocation time of about 50%)
- void* unused_;
+ void* unused_; /** @todo do I really need this? */
};
# undef BOOST_CLOSURE_AUX_defaults
Modified: sandbox/closure/boost/closure/aux_/macro/code_/end.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/macro/code_/end.hpp (original)
+++ sandbox/closure/boost/closure/aux_/macro/code_/end.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -7,8 +7,8 @@
#ifndef BOOST_CLOSURE_AUX_CODE_END_HPP_
#define BOOST_CLOSURE_AUX_CODE_END_HPP_
-#include <boost/closure/config.hpp>
#include <boost/closure/aux_/symbol.hpp>
+#include <boost/closure/aux_/config.hpp>
#include <boost/closure/aux_/function.hpp>
#include <boost/closure/aux_/macro/closure.hpp>
#include <boost/closure/aux_/macro/code_/functor.hpp>
@@ -137,7 +137,7 @@
// local functions even if they are not explicitly specified inline.
#define BOOST_CLOSURE_AUX_CODE_END_MAYBE_INLINE_(qualified_name) \
BOOST_PP_IIF(BOOST_PP_BITOR( \
- BOOST_CLOSURE_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_INLINE_FRONT(qualified_name)), \
/* on C++11 always use inlining because compilers might optimize */ \
/* it to be faster and it can also be passed as tparam */ \
Modified: sandbox/closure/boost/closure/aux_/macro/code_/functor.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/macro/code_/functor.hpp (original)
+++ sandbox/closure/boost/closure/aux_/macro/code_/functor.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -8,8 +8,11 @@
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_HPP_
#include <boost/closure/aux_/symbol.hpp>
+#include <boost/closure/aux_/config.hpp>
#include <boost/closure/aux_/function.hpp>
#include <boost/closure/aux_/add_pointed_const.hpp>
+#include <boost/closure/aux_/member.hpp>
+#include <boost/closure/aux_/nobind.hpp>
#include <boost/closure/aux_/macro/closure.hpp>
#include <boost/closure/aux_/macro/closure_typeof.hpp>
#include <boost/closure/aux_/macro/code_/result.hpp>
@@ -19,7 +22,7 @@
#include <boost/closure/aux_/preprocessor/traits/decl_const_binds.hpp>
#include <boost/closure/detail/preprocessor/keyword/auto.hpp>
#include <boost/closure/detail/preprocessor/keyword/register.hpp>
-#include <boost/closure/detail/preprocessor/keyword/this.hpp>
+#include <boost/closure/detail/preprocessor/keyword/thisunderscore.hpp>
#include <boost/utility/identity.hpp>
#include <boost/scope_exit.hpp>
#include <boost/type_traits/add_const.hpp>
@@ -82,9 +85,8 @@
BOOST_CLOSURE_AUX_CODE_FUNCTOR_F_TYPE_ \
>::BOOST_PP_CAT(BOOST_PP_CAT(arg, i), _type) \
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_ENUM_( \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_( \
r, typename01, i, param_traits) \
- BOOST_PP_COMMA_IF(i) \
BOOST_PP_EXPR_IIF(typename01, typename) \
::boost::call_traits< \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_TYPE_(typename01, \
@@ -92,6 +94,17 @@
>::param_type \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_(BOOST_PP_INC(i))
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_ENUM_( \
+ r, typename01, i, param_traits) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_(r, typename01, i, \
+ param_traits)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_PARAM_ARG_DECL_( \
+ r, typename01, i, param_traits) \
+ , BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_(r, typename01, i, \
+ param_traits)
+
// Precondition: !EMPTY(DEFAULT(param_traits))
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_DEFAULT_ASSIGNMENT_(param_traits) \
= BOOST_CLOSURE_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_FRONT( \
@@ -125,47 +138,56 @@
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_ \
BOOST_CLOSURE_AUX_SYMBOL( (bind_this) )
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_TYPE_( \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_STATIC_BIND_MEMBER_THIS_(id) \
+ , static_cast< BOOST_CLOSURE_AUX_CODE_FUNCTOR_CLASS_TYPE_(id)* >(object)-> \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_TYPE_( \
id, typename01, offset, i, bind_var_without_type) \
BOOST_PP_EXPR_IIF(typename01, typename) \
BOOST_SCOPE_EXIT_AUX_PARAMS_T(id):: \
BOOST_SCOPE_EXIT_AUX_PARAM_T(id, BOOST_PP_ADD(i, offset), \
bind_var_without_type) \
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_( \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_ENUM_( \
r, offset, i, bind_traits) \
BOOST_PP_COMMA_IF(i) \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_VAR_( \
BOOST_PP_ADD(offset, i))
// Adapted from `BOOST_SCOPE_EXIT_AUX_ARG_DECL()`.
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_( \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_TYPE_( \
r, id_typename_offset_const, i, bind_var_without_type) \
- /* IMPORTANT: here can't use `PP_KEYWORD_IS_THIS_FRONT()` because some */ \
- /* `param_name` might start with non-alphanumeric symbol `&` (but that */ \
- /* is never the case for `this`) */ \
+ /* IMPORTANT: here can't use `PP_KEYWORD_IS_THISUNDERSCORE_FRONT()` */ \
+ /* because some `param_name` might start with non-alphanumeric symbol */ \
+ /* `&` (but that is never the case for `this`) */ \
BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(4, 1, id_typename_offset_const), \
typename \
) \
BOOST_PP_IIF(BOOST_PP_COMPL(BOOST_PP_TUPLE_ELEM(4, 3, \
id_typename_offset_const)), \
BOOST_PP_EMPTY \
- , BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THIS_BACK( \
+ , BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK( \
bind_var_without_type), \
/* pointed obj const */ \
- BOOST_PP_IDENTITY( ::boost::local::aux::add_pointed_const< ) \
+ BOOST_PP_IDENTITY( ::boost::closure::aux::add_pointed_const< ) \
, \
BOOST_PP_IDENTITY( ::boost::add_const< ) /* outer type const */ \
))() \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_TYPE_( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_TYPE_( \
BOOST_PP_TUPLE_ELEM(4, 0, id_typename_offset_const), \
BOOST_PP_TUPLE_ELEM(4, 1, id_typename_offset_const), \
BOOST_PP_TUPLE_ELEM(4, 2, id_typename_offset_const), \
i, bind_var_without_type) \
BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(4, 3, id_typename_offset_const), \
>::type \
- ) \
- BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THIS_BACK( \
+ )
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_( \
+ r, id_typename_offset_const, i, bind_var_without_type) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_TYPE_( \
+ r, id_typename_offset_const, i, bind_var_without_type) \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK( \
BOOST_CLOSURE_AUX_PP_BIND_TRAITS_VAR_WITHOUT_TYPE( \
bind_var_without_type)), \
this_ BOOST_PP_TUPLE_EAT(1) \
@@ -173,6 +195,48 @@
BOOST_PP_TUPLE_REM(1) \
)(bind_var_without_type)
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_TYPE_( \
+ r, id_typename_offset_const, i, bind_traits) \
+ , BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_TYPE_( \
+ r, id_typename_offset_const, i, \
+ BOOST_CLOSURE_AUX_PP_BIND_TRAITS_VAR_WITHOUT_TYPE(bind_traits))
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_(offset, i) \
+ BOOST_PP_CAT(bind, BOOST_PP_ADD(offset, i))
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_ENUM_( \
+ r, offset, i, bind_traits) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_(offset, i)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_PARAM_DECL_( \
+ r, id_typename_offset_const, i, bind_traits) \
+ , BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_TYPE_( \
+ r, id_typename_offset_const, i, \
+ BOOST_CLOSURE_AUX_PP_BIND_TRAITS_VAR_WITHOUT_TYPE(bind_traits)) & \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_( \
+ BOOST_PP_TUPLE_ELEM(4, 2, id_typename_offset_const), i)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_THIS_TYPE_(id) \
+ , BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_THIS_PARAM_ \
+ bind_this
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_THIS_PARAM_DECL_(id) \
+ , BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) & \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_THIS_PARAM_
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_(z, n, unused) \
+ , ::boost::closure::aux::nobind
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_TYPE_(z, n, unused) \
+ , ::boost::closure::aux::nobind_t
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_PARAM_DECL_(z, n, unused) \
+ , ::boost::closure::aux::nobind_t & \
+ /* param name not needed here because no bind param not used */
+
// Adapted from `BOOST_SCOPE_EXIT_AUX_ARG_DECL()`.
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_ENUM_( \
r, id_typename_offset_const, i, bind_traits) \
@@ -183,14 +247,26 @@
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_DECL_( \
r, id_typename_offset_const, i, bind_traits) \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_( \
- r, id_typename_offset_const, i, \
- & /* all bind member vars are refs to ScopeExit struct members */ \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_VAR_( \
- BOOST_PP_ADD(i, BOOST_PP_TUPLE_ELEM(4, 2, \
- id_typename_offset_const)))) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(4, 1, id_typename_offset_const), \
+ typename \
+ ) \
+ ::boost::closure::aux::member_type< \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_DECL_TYPE_( \
+ r, id_typename_offset_const, i, bind_var_without_type) \
+ >::reference \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_VAR_( \
+ BOOST_PP_ADD(i, BOOST_PP_TUPLE_ELEM(4, 2, \
+ id_typename_offset_const))) \
; /* end member variable declaration */
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_STATIC_BIND_MEMBER_( \
+ r, id_typename_offset_const, i, bind_traits) \
+ , static_cast< BOOST_CLOSURE_AUX_CODE_FUNCTOR_CLASS_TYPE_( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_typename_offset_const))* >(object)-> \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_VAR_( \
+ BOOST_PP_ADD(i, BOOST_PP_TUPLE_ELEM(4, 2, \
+ id_typename_offset_const)))
+
// Adapted from `BOOST_SCOPE_EXIT_AUX_ARG()`.
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_INIT_ENUM_( \
r, id_offset, i, bind_traits) \
@@ -236,70 +312,128 @@
// Functor call operations.
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_(z, defaults_n, decl_traits, \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_BODY_( \
+ const_bind_macro, bind_macro, const_bind_this_macro, bind_this_macro, \
+ param_macro, \
params, const_binds, has_const_bind_this, binds, has_bind_this, \
id, typename01) \
- inline BOOST_CLOSURE_AUX_CODE_RESULT_TYPE(id) operator()( \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_ENUM_, \
- typename01, params) \
- ) const { \
- /* just forward call to member function with local func name */ \
- return BOOST_CLOSURE_AUX_CODE_FUNCTOR_BODY_FUNC_( \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_, \
- 0 /* no offset */, const_binds) \
- /* pass plain binds */ \
- BOOST_PP_COMMA_IF( \
- BOOST_PP_BITAND( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BODY_FUNC_( \
+ BOOST_PP_LIST_FOR_EACH_I(const_bind_macro, \
+ 0 /* no offset */, const_binds) \
+ /* pass plain binds */ \
+ BOOST_PP_COMMA_IF( \
+ BOOST_PP_BITAND( \
+ BOOST_PP_LIST_IS_CONS(const_binds) \
+ , BOOST_PP_LIST_IS_CONS(binds) \
+ ) \
+ ) \
+ BOOST_PP_LIST_FOR_EACH_I(bind_macro, \
+ /* offset index of # const-binds (could be 0) */ \
+ BOOST_PP_LIST_SIZE(const_binds), binds) \
+ /* pass bind `this` */ \
+ BOOST_PP_COMMA_IF( \
+ BOOST_PP_BITAND( \
+ BOOST_PP_BITOR( \
BOOST_PP_LIST_IS_CONS(const_binds) \
, BOOST_PP_LIST_IS_CONS(binds) \
- ) \
+ ) \
+ , BOOST_PP_BITOR(has_const_bind_this, has_bind_this) \
) \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_, \
- /* offset index of # const-binds (could be 0) */ \
- BOOST_PP_LIST_SIZE(const_binds), binds) \
- /* pass bind `this` */ \
- BOOST_PP_COMMA_IF( \
- BOOST_PP_BITAND( \
+ ) \
+ BOOST_PP_EXPR_IIF(has_const_bind_this, const_bind_this_macro) \
+ BOOST_PP_EXPR_IIF(has_bind_this, bind_this_macro) \
+ /* pass params */ \
+ BOOST_PP_COMMA_IF( \
+ BOOST_PP_BITAND( \
+ BOOST_PP_BITOR( \
BOOST_PP_BITOR( \
BOOST_PP_LIST_IS_CONS(const_binds) \
, BOOST_PP_LIST_IS_CONS(binds) \
) \
, BOOST_PP_BITOR(has_const_bind_this, has_bind_this) \
- ) \
+ ) \
+ , BOOST_PP_LIST_IS_CONS(params) \
) \
- BOOST_PP_EXPR_IIF( \
- BOOST_PP_BITOR(has_const_bind_this, has_bind_this), \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_ \
- ) \
- /* pass params */ \
- BOOST_PP_COMMA_IF( \
- BOOST_PP_BITAND( \
- BOOST_PP_BITOR( \
- BOOST_PP_BITOR( \
- BOOST_PP_LIST_IS_CONS(const_binds) \
- , BOOST_PP_LIST_IS_CONS(binds) \
- ) \
- , BOOST_PP_BITOR(has_const_bind_this, has_bind_this) \
- ) \
- , BOOST_PP_LIST_IS_CONS(params) \
- ) \
- ) \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_ENUM_, ~, \
- params) \
- ); \
+ ) \
+ BOOST_PP_LIST_FOR_EACH_I(param_macro, ~, params) \
+ )
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_(z, defaults_n, decl_traits, \
+ params, const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ inline BOOST_CLOSURE_AUX_CODE_RESULT_TYPE(id) operator()( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_ENUM_, \
+ typename01, params) \
+ ) const { \
+ /* just forward call to member function with local func name */ \
+ return BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_BODY_( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_ENUM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_MEMBER_BIND_ENUM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_ENUM_, \
+ params, const_binds, has_const_bind_this, binds, \
+ has_bind_this, id, typename01); \
}
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_( \
z, defaults_n, unused) \
BOOST_CLOSURE_AUX_SYMBOL( (call)(defaults_n) )
-#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_ADDR_( \
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_COMMA_FUNC_ADDR_( \
z, defaults_n, unused) \
- &BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_(z, defaults_n, unused)
+ , &BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_(z, defaults_n, unused)
+
+// Precondition: !CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_COMMA_BIND_PARAM_DECLS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_PARAM_DECL_, \
+ ( id, typename01, 0 /* no offset */, 1 /* const */ ), const_binds) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_PARAM_DECL_, \
+ /* offset of # of const-binds */ \
+ ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), 0 /* const */ ),\
+ binds) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, \
+ has_const_bind_this), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_THIS_PARAM_DECL_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(id) \
+ /* fill with nobind_t (if no local-types as tparams) */ \
+ BOOST_PP_REPEAT(BOOST_PP_SUB(BOOST_CLOSURE_CONFIG_BIND_MAX, \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, \
+ has_const_bind_this), \
+ BOOST_PP_INC \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )(BOOST_PP_LIST_SIZE(BOOST_PP_LIST_APPEND(const_binds, \
+ binds)))), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_PARAM_DECL_, ~)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_OPERATOR_( \
+ params, const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ operator()( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_ENUM_, ~, \
+ params) \
+ )
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_BODY_( \
+ params, const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_BODY_( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_ENUM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_PARAM_ENUM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_THIS_PARAM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_THIS_PARAM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_ENUM_, \
+ params, const_binds, has_const_bind_this, binds, \
+ has_bind_this, id, typename01)
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_(z, defaults_n, \
decl_traits, params, const_binds, has_const_bind_this, binds, \
@@ -307,9 +441,15 @@
inline static BOOST_CLOSURE_AUX_CODE_RESULT_TYPE(id) \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_(z, defaults_n, ~)( \
void* object \
- BOOST_PP_COMMA_IF(BOOST_PP_LIST_IS_CONS(params)) \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
+ BOOST_PP_TUPLE_EAT(6) \
+ , \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_COMMA_BIND_PARAM_DECLS_ \
+ )(const_binds, has_const_bind_this, binds, has_bind_this, id, \
+ typename01) \
BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_DECL_ENUM_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_PARAM_ARG_DECL_, \
typename01, params) \
) { \
/* run-time: casting object to this class type and forward call to */ \
@@ -320,14 +460,19 @@
/* C++03 compliant because `static_cast` is not a template (even */ \
/* if its syntax resembles a function template call) in fact even */ \
/* in C is legal to cast to a local struct (using C-style casting) */ \
- return static_cast< BOOST_CLOSURE_AUX_CODE_FUNCTOR_CLASS_TYPE_(id)* >( \
- object)->operator()( \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_PARAM_ARG_NAME_ENUM_, ~, \
- params) \
- ); \
+ return \
+ static_cast< BOOST_CLOSURE_AUX_CODE_FUNCTOR_CLASS_TYPE_(id)* >( \
+ object)-> \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01,\
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_OPERATOR_ \
+ , \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_BODY_ \
+ )(params, const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ ; \
}
-
+
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_CALL_FOR_DEFAULTS_(z, n, \
op_decl_params_constbinds_hasconstthis_binds_hasthis_id_typename) \
BOOST_PP_EXPAND( \
@@ -358,10 +503,129 @@
) /* end `op_macro(...)` */ \
) /* end expand */
+// Functor binds.
+
+// Precondition: !CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS.
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_TYPES_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_TYPE_, \
+ ( id, typename01, 0 /* no offset */, 1 /* const */ ), \
+ const_binds) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_BIND_TYPE_, \
+ /* offset of # of const-binds */ \
+ ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), 0 /* const */ ),\
+ binds) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, \
+ has_const_bind_this), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_THIS_TYPE_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(id) \
+ /* fill with nobind_t (if no local-types as tparams) */ \
+ BOOST_PP_REPEAT(BOOST_PP_SUB(BOOST_CLOSURE_CONFIG_BIND_MAX, \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, has_const_bind_this), \
+ BOOST_PP_INC \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )(BOOST_PP_LIST_SIZE(BOOST_PP_LIST_APPEND(const_binds, binds)))), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_TYPE_, ~)
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_TYPEOF_TYPEDEFS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ /* typeof types -- these types are qualified with extra eventual */ \
+ /* const and/or & if their variables are bound by const and/or & */ \
+ /* (this is because it is not possible to strip the eventual & */ \
+ /* given that the var name is always attached to the & symbol plus */ \
+ /* programmers can always remove const& using type traits) */ \
+ /* const bind typeof types */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_TYPEDEF_,\
+ (id, typename01, 0 /* no offset */, 1 /* const-bind */ ), \
+ const_binds) \
+ /* bind typeof types */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_TYPEDEF_, \
+ /* offset index with # of preceding const-binds (if any) */ \
+ ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), \
+ 0 /* not const-bind */ ), binds) \
+ /* const this... */ \
+ BOOST_PP_EXPR_IIF(has_const_bind_this, \
+ typedef BOOST_CLOSURE_AUX_CLOSURE_TYPEOF_TYPE( \
+ BOOST_PP_EXPR_IIF(typename01, typename) \
+ ::boost::closure::aux::add_pointed_const< \
+ BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
+ >::type \
+ this_ \
+ ) ; /* close typedef */ \
+ ) \
+ /* ... or, non-const this */ \
+ BOOST_PP_EXPR_IIF(has_bind_this, \
+ typedef BOOST_CLOSURE_AUX_CLOSURE_TYPEOF_TYPE( \
+ BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
+ this_ \
+ ) ; /* close typedef */ \
+ )
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_DECLS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ /* run-time: it is faster if call `operator()` just accesses member */ \
+ /* references to the ScopeExit struct instead of accessing the bind */ \
+ /* struct at each call (these mem refs are init by the constructor) */ \
+ BOOST_PP_LIST_FOR_EACH_I( /* const bind member references */ \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_DECL_, \
+ ( id, typename01, 0 /* no offset */, 1 /* const */ ), \
+ const_binds) \
+ BOOST_PP_LIST_FOR_EACH_I( /* bind member references */ \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_DECL_, \
+ /* offset index of # of const-binds (could be 0) */ \
+ ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), \
+ 0 /* no const */ ), binds) \
+ /* bind this const or not (pointed-const is not added here because */ \
+ /* this is a reference, it is added to the this_ body param instead */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(has_bind_this, has_const_bind_this), \
+ BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) /* this is ptr so no & */ \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_ \
+ ; /* end member variable declaration */ \
+ )
+
+#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_STATIC_BINDS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_STATIC_BIND_MEMBER_, \
+ ( id, typename01, 0 /* no offset */, 1 /* const */ ), const_binds) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_MAYBECONST_STATIC_BIND_MEMBER_, \
+ /* offset of # of const-binds */ \
+ ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), 0 /* const */ ), \
+ binds) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, \
+ has_const_bind_this), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_STATIC_BIND_MEMBER_THIS_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(id) \
+ /* fill with nobind_t (if no local-types as tparams) */ \
+ BOOST_PP_REPEAT(BOOST_PP_SUB(BOOST_CLOSURE_CONFIG_BIND_MAX, \
+ BOOST_PP_IIF(BOOST_PP_BITOR(has_bind_this, has_const_bind_this), \
+ BOOST_PP_INC \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )(BOOST_PP_LIST_SIZE(BOOST_PP_LIST_APPEND(const_binds, binds)))), \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_NOBIND_, ~)
+
+// Functor inits.
+
#define BOOST_CLOSURE_AUX_CODE_FUNCTOR_MEMBER_INITS_( \
- const_binds, has_const_bind_this, binds, has_bind_this, id) \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(BOOST_PP_BITOR(BOOST_PP_BITOR( \
- BOOST_PP_LIST_IS_CONS(const_binds), BOOST_PP_LIST_IS_CONS(binds)), \
+ BOOST_PP_LIST_IS_CONS(const_binds), BOOST_PP_LIST_IS_CONS(binds)),\
has_bind_this), has_const_bind_this), \
: \
) \
@@ -415,46 +679,23 @@
/* it does not have to have ID postfix) */ \
typedef BOOST_PP_EXPR_IIF(typename01, typename) \
BOOST_IDENTITY_TYPE(( /* IDENTITY for template param comma */ \
- ::boost::local::aux::function< \
+ ::boost::closure::aux::function< \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_F_TYPE_ \
, default_count \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
+ BOOST_PP_TUPLE_EAT(6) \
+ , \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_BIND_TYPES_ \
+ )(const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
> \
)) \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_TYPE \
; \
- /* typeof types -- these types are qualified with extra eventual */ \
- /* const and/or & if their variables are bound by const and/or & */ \
- /* (this is because it is not possible to strip the eventual & */ \
- /* given that the var name is always attached to the & symbol plus */ \
- /* programmers can always remove const& using type traits) */ \
- /* const bind typeof types */ \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_TYPEDEF_,\
- (id, typename01, 0 /* no offset */, 1 /* const-bind */ ), \
- const_binds) \
- /* bind typeof types */ \
- BOOST_PP_LIST_FOR_EACH_I( \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_TYPEDEF_, \
- /* offset index with # of preceding const-binds (if any) */ \
- ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), \
- 0 /* not const-bind */ ), binds) \
- /* const this... */ \
- BOOST_PP_EXPR_IIF(has_const_bind_this, \
- typedef BOOST_CLOSURE_AUX_CLOSURE_TYPEOF_TYPE( \
- BOOST_PP_EXPR_IIF(typename01, typename) \
- ::boost::local::aux::add_pointed_const< \
- BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
- >::type \
- this_ \
- ) ; /* close typedef */ \
- ) \
- /* ... or, non-const this */ \
- BOOST_PP_EXPR_IIF(has_bind_this, \
- typedef BOOST_CLOSURE_AUX_CLOSURE_TYPEOF_TYPE( \
- BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
- this_ \
- ) ; /* close typedef */ \
- ) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_TYPEOF_TYPEDEFS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
public: \
/* constructor */ \
inline explicit BOOST_CLOSURE_AUX_CODE_FUNCTOR_CLASS_TYPE_(id)( \
@@ -463,7 +704,7 @@
/* within paren so you must handle these commas manually if */ \
/* expanding this macro within another macro */ \
BOOST_CLOSURE_AUX_CODE_FUNCTOR_MEMBER_INITS_(const_binds, \
- has_const_bind_this, binds, has_bind_this, id) \
+ has_const_bind_this, binds, has_bind_this, id, typename01) \
{ /* do nothing */ } \
/* run-time: implement `operator()` (and for all default params) so */ \
/* this obj can be used directly as a functor for C++03 extensions */ \
@@ -495,35 +736,25 @@
) \
inline static void BOOST_CLOSURE_AUX_FUNCTION_INIT_CALL_FUNC( \
void* object, BOOST_CLOSURE_AUX_CODE_FUNCTOR_TYPE& functor) { \
- functor.BOOST_CLOSURE_AUX_FUNCTION_INIT_CALL_FUNC(object, \
- BOOST_PP_ENUM( \
- /* PP_INC to handle no dflt (EXPAND for MVSC) */ \
+ functor.BOOST_CLOSURE_AUX_FUNCTION_INIT_CALL_FUNC( \
+ object \
+ BOOST_PP_IIF( \
+ BOOST_CLOSURE_AUX_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01, \
+ BOOST_PP_TUPLE_EAT(6) \
+ , \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_COMMA_STATIC_BINDS_ \
+ )(const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
+ BOOST_PP_REPEAT( /* INC to handle no dflt (EXPAND for MVSC) */ \
BOOST_PP_EXPAND(BOOST_PP_INC(default_count)), \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_FUNC_ADDR_, \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_STATIC_CALL_COMMA_FUNC_ADDR_, \
~) \
); \
} \
private: \
- /* run-time: it is faster if call `operator()` just accesses member */ \
- /* references to the ScopeExit struct instead of accessing the bind */ \
- /* struct at each call (these mem refs are init by the constructor) */ \
- BOOST_PP_LIST_FOR_EACH_I( /* const bind member references */ \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_DECL_,\
- ( id, typename01, 0 /* no offset */, 1 /* const */ ), \
- const_binds) \
- BOOST_PP_LIST_FOR_EACH_I( /* bind member references */ \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_MAYBECONST_BIND_MEMBER_DECL_, \
- /* offset index of # of const-binds (could be 0) */ \
- ( id, typename01, BOOST_PP_LIST_SIZE(const_binds), \
- 0 /* no const */ ), binds) \
- /* bind this const or not (pointed-const is not added here because */ \
- /* this is a reference, it is added to the this_ body param instead */ \
- BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(has_bind_this, has_const_bind_this), \
- BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
- & /* all bind member vars are refs to ScopeExit struct members */ \
- BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_THIS_ \
- ; /* end member variable declaration */ \
- ) \
+ BOOST_CLOSURE_AUX_CODE_FUNCTOR_BIND_MEMBER_DECLS_( \
+ const_binds, has_const_bind_this, binds, has_bind_this, \
+ id, typename01) \
/* this decl allows for nesting (local functions, etc) as */ \
/* it makes the args variable visible within the body code (which */ \
/* cannot be static); this is for compilation only as the args */ \
@@ -564,7 +795,7 @@
/* const pointer to const object */ \
BOOST_PP_EXPR_IIF(has_const_bind_this, \
BOOST_PP_EXPR_IIF(typename01, typename) \
- ::boost::local::aux::add_pointed_const< \
+ ::boost::closure::aux::add_pointed_const< \
BOOST_CLOSURE_AUX_CODE_BIND_THIS_TYPE(id) \
>::type const \
this_ /* special name to access object this */ \
Modified: sandbox/closure/boost/closure/aux_/macro/code_/result.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/macro/code_/result.hpp (original)
+++ sandbox/closure/boost/closure/aux_/macro/code_/result.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -43,8 +43,7 @@
// User did not explicitly specified result type, deduce it (using Typeof).
#define BOOST_CLOSURE_AUX_CODE_RESULT_DEDUCE_(decl_traits, id, typename01) \
- BOOST_CLOSURE_AUX_CODE_RESULT_DECL(decl_traits, id, \
- typename01) \
+ BOOST_CLOSURE_AUX_CODE_RESULT_DECL(id) \
/* the many tagging, wrapping, etc that follow are taken from ScopeExit */ \
/* type deduction mechanism and they are necessary within templates */ \
/* (at least on GCC) to work around an compiler internal error */ \
@@ -99,8 +98,7 @@
#define BOOST_CLOSURE_AUX_CODE_RESULT_TYPE(id) \
BOOST_CLOSURE_AUX_SYMBOL( (result_type)(id) )
-#define BOOST_CLOSURE_AUX_CODE_RESULT_DECL( \
- decl_traits, id, typename01) \
+#define BOOST_CLOSURE_AUX_CODE_RESULT_DECL(id) \
/* result type here */ (*BOOST_CLOSURE_AUX_CODE_RESULT_FUNC_(id))();
#define BOOST_CLOSURE_AUX_CODE_RESULT(decl_traits, id, typename01) \
Modified: sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/sign.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/sign.hpp (original)
+++ sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/sign.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -17,7 +17,7 @@
#include <boost/closure/detail/preprocessor/keyword/bind.hpp>
#include <boost/closure/detail/preprocessor/keyword/return.hpp>
#include <boost/closure/detail/preprocessor/keyword/default.hpp>
-#include <boost/closure/detail/preprocessor/keyword/this.hpp>
+#include <boost/closure/detail/preprocessor/keyword/thisunderscore.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/seq/fold_left.hpp>
@@ -40,7 +40,7 @@
#define BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_( \
decl_traits, sign) \
/* check from back because non `this` bounds might have `&` in front */ \
- BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THIS_BACK( \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK( \
/* remove all leading symbols `[const] bind [(type)] ...` */ \
BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE(sign)),\
BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALID_CONST_BIND_THIS_ \
@@ -64,7 +64,7 @@
#define BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALID_BIND_(decl_traits, sign) \
/* check from back because non `this` bounds might have `&` in front */ \
- BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THIS_BACK( \
+ BOOST_PP_IIF(BOOST_CLOSURE_DETAIL_PP_KEYWORD_IS_THISUNDERSCORE_BACK( \
/* remove all leading symbols `[const] bind [(type)] ...` */ \
BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_ANY_BIND_WITHOUT_TYPE( \
sign)), \
Modified: sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/validate.hpp
==============================================================================
--- sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/validate.hpp (original)
+++ sandbox/closure/boost/closure/aux_/preprocessor/traits/decl_sign_/validate.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -8,12 +8,24 @@
#define BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_HPP_
#include <boost/closure/aux_/preprocessor/traits/decl_sign_/validate_/defaults.hpp>
+#include <boost/closure/aux_/preprocessor/traits/decl_sign_/validate_/this.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_1_(sign, error) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(error(/* expand empty */)), \
+ BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_THIS \
+ , \
+ error BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
// PUBLIC //
// Validate params seq before starting to parse it.
#define BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE(sign) \
- BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_DEFAULTS(sign)
+ BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_1_(sign, \
+ BOOST_CLOSURE_AUX_PP_DECL_TRAITS_SIGN_VALIDATE_DEFAULTS(sign))
#endif // #include guard
Modified: sandbox/closure/boost/closure/config.hpp
==============================================================================
--- sandbox/closure/boost/closure/config.hpp (original)
+++ sandbox/closure/boost/closure/config.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -12,8 +12,6 @@
#ifndef BOOST_CLOSURE_CONFIG_HPP_
#define BOOST_CLOSURE_CONFIG_HPP_
-#include <boost/config_ext.hpp>
-
// User defined.
/**
@@ -37,12 +35,8 @@
# define BOOST_CLOSURE_CONFIG_FUNCTION_ARITY_MAX 5
#endif
-// For internal library use.
-
-#if defined(BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS)
-# define BOOST_CLOSURE_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01 1
-#else
-# define BOOST_CLOSURE_CONFIG_LOCAL_TYPES_AS_TEMPLATE_PARAMS_01 0
+#ifndef BOOST_CLOSURE_CONFIG_BIND_MAX
+# define BOOST_CLOSURE_CONFIG_BIND_MAX 3 /** @todo increase this (to 10?) */
#endif
#endif // #include guard
Modified: sandbox/closure/boost/config_ext.hpp
==============================================================================
--- sandbox/closure/boost/config_ext.hpp (original)
+++ sandbox/closure/boost/config_ext.hpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -9,16 +9,22 @@
#include <boost/config.hpp>
+/** @todo change the structure of this code when moved into Boost.Config which is organized by compiler (and not by feature) */
+
// If it is possible to pass local types (classes, etc) as template parameters.
// This is not possible in pure C++03 but it is possible in some C++03
// extensions (MSVC, GCC 4.5.x, etc).
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)) && \
defined(__GXX_EXPERIMENTAL_CXX0X__)
// From GCC 4.5.x when -std=c++0x specified.
-# define BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS
+# define BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS_
#elif defined(_MSC_VER)
// For (all?) MSVC (tested on MVSC 8.0).
-# define BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS
+# define BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS_
+#endif
+
+#if !defined(BOOST_LOCAL_TYPES_AS_TEMPLATE_PARAMS_)
+# define BOOST_NO_LOCAL_TYPES_AS_TEMPLATE_PARAMS
#endif
#endif // #include guard
Modified: sandbox/closure/libs/closure/example/Jamfile.v2
==============================================================================
--- sandbox/closure/libs/closure/example/Jamfile.v2 (original)
+++ sandbox/closure/libs/closure/example/Jamfile.v2 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -1,9 +1,4 @@
-# Copyright (C) 2009-2011 Lorenzo Caminiti
-# Use, modification, and distribution is subject to the Boost Software
-# License, Version 1.0 (see accompanying file LICENSE_1_0.txt or a
-# copy at http://www.boost.org/LICENSE_1_0.txt).
-
exe profile_boost_closure : profile_boost_closure.cpp :
<library>/boost/chrono//boost_chrono
<library>/boost/system//boost_system
Modified: sandbox/closure/libs/closure/example/profile_boost_closure.cpp
==============================================================================
--- sandbox/closure/libs/closure/example/profile_boost_closure.cpp (original)
+++ sandbox/closure/libs/closure/example/profile_boost_closure.cpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -4,6 +4,7 @@
// License, Version 1.0 (see accompanying file LICENSE_1_0.txt or a
// copy at http://www.boost.org/LICENSE_1_0.txt).
+//[example_profile_boost_closure_cpp
#include <boost/closure.hpp>
#include <boost/chrono.hpp>
#include <vector>
@@ -20,7 +21,7 @@
boost::chrono::system_clock::time_point start =
boost::chrono::system_clock::now();
- void BOOST_CLOSURE( (const double& num) (bind& sum) (const bind& factor) ) {
+ void BOOST_CLOSURE(const double& num, bind& sum, const bind& factor) {
sum += factor * num;
} BOOST_CLOSURE_END(add)
boost::chrono::duration<double> decl_sec =
@@ -30,7 +31,7 @@
std::fill(v.begin(), v.end(), 1.0);
boost::chrono::duration<double> trials_sec;
- for (unsigned long i = 0; i < trials; ++i) {
+ for(unsigned long i = 0; i < trials; ++i) {
boost::chrono::system_clock::time_point start =
boost::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), add);
@@ -40,4 +41,5 @@
profile::print(size, trials, sum, trials_sec.count(), decl_sec.count());
return 0;
}
+//]
Modified: sandbox/closure/libs/closure/example/profile_boost_phoenix.cpp
==============================================================================
--- sandbox/closure/libs/closure/example/profile_boost_phoenix.cpp (original)
+++ sandbox/closure/libs/closure/example/profile_boost_phoenix.cpp 2012-01-07 18:43:20 EST (Sat, 07 Jan 2012)
@@ -4,6 +4,7 @@
// License, Version 1.0 (see accompanying file LICENSE_1_0.txt or a
// copy at http://www.boost.org/LICENSE_1_0.txt).
+//[example_profile_boost_phoenix_cpp
#include <boost/chrono.hpp>
#include <boost/spirit/home/phoenix/statement/sequence.hpp>
#include <boost/spirit/home/phoenix/core/reference.hpp>
@@ -25,7 +26,7 @@
std::fill(v.begin(), v.end(), 1.0);
boost::chrono::duration<double> trials_sec;
- for (unsigned long i = 0; i < trials; ++i) {
+ for(unsigned long i = 0; i < trials; ++i) {
boost::chrono::system_clock::time_point start =
boost::chrono::system_clock::now();
@@ -41,4 +42,5 @@
profile::print(size, trials, sum, trials_sec.count());
return 0;
}
+//]
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk