diff options
author | Murray Cumming <murrayc@murrayc.com> | 2016-01-14 21:51:06 +0100 |
---|---|---|
committer | Murray Cumming <murrayc@murrayc.com> | 2016-03-02 11:52:29 +0100 |
commit | 93bebfe2b6557c91b0369d6a0e6a46c63569ec7c (patch) | |
tree | 0123b4cd812c6db15d01c5916a1f5696955c5d37 | |
parent | 36af63b630ff316e4e739ea14807cd6e07009eb5 (diff) | |
download | sigc++-93bebfe2b6557c91b0369d6a0e6a46c63569ec7c.tar.gz |
retype: Make this variadic.
However, we still need to generate const/volatile/const_volatile/
bound_const/bound_volatile/bound_const_volatile versions.
-rw-r--r-- | sigc++/adaptors/macros/retype.h.m4 | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/sigc++/adaptors/macros/retype.h.m4 b/sigc++/adaptors/macros/retype.h.m4 index 96f359b..9952a43 100644 --- a/sigc++/adaptors/macros/retype.h.m4 +++ b/sigc++/adaptors/macros/retype.h.m4 @@ -18,22 +18,6 @@ divert(-1) include(template.macros.m4) -define([RETYPE_OPERATOR],[dnl -ifelse($1,0,[dnl - decltype(auto) operator()() - { return this->functor_(); } - -],[dnl - template <LOOP(class T_arg%1, $1)> - decltype(auto) - operator()(LOOP(T_arg%1 _A_a%1, $1)) - { return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<LOOP(type_trait_take_t<T_type%1>, $1)> - (LOOP([[static_cast<T_type%1>(_A_a%1)]], $1)); - } - -])dnl -]) - define([RETYPE_MEM_FUNCTOR],[dnl /** Creates an adaptor of type sigc::retype_functor which performs C-style casts on the parameters passed on to the functor. @@ -44,10 +28,10 @@ define([RETYPE_MEM_FUNCTOR],[dnl * * @ingroup retype */ -template <LIST(class T_return, class T_obj, LOOP(class T_arg%1, $1))> -inline retype_functor<LIST($2[]mem_functor<LIST(T_return, T_obj, LOOP(T_arg%1, $1))>, LOOP(T_arg%1, $1)) > -retype(const $2[]mem_functor<LIST(T_return, T_obj, LOOP(T_arg%1, $1))>& _A_functor) -{ return retype_functor<LIST($2[]mem_functor<LIST(T_return, T_obj, LOOP(T_arg%1, $1))>, LOOP(T_arg%1, $1)) > +template <class T_return, class T_obj, class... T_arg> +inline decltype(auto) +retype(const $1[]mem_functor<T_return, T_obj, T_arg...>& _A_functor) +{ return retype_functor<LIST($1[]mem_functor<T_return, T_obj, T_arg...>, T_arg...) > (_A_functor); } ]) @@ -112,20 +96,24 @@ namespace sigc { * Use the convenience function sigc::retype() to create an instance of retype_functor. * * The following template arguments are used: - * - @e T_functor Type of the functor to wrap.dnl -FOR(1, CALL_SIZE,[ - * - @e T_type%1 Type of @e T_functor's %1th argument.]) + * - @e T_functor Type of the functor to wrap. + * - @e T_type Types of @e T_functor's arguments. * * @ingroup retype */ -template <LIST(class T_functor, LOOP(class T_type%1=nil, CALL_SIZE))> +template <class T_functor, class... T_type> struct retype_functor : public adapts<T_functor> { typedef typename adapts<T_functor>::adaptor_type adaptor_type; typedef typename adapts<T_functor>::result_type result_type; -FOR(0,CALL_SIZE,[[RETYPE_OPERATOR(%1)]])dnl + template <class... T_arg> + decltype(auto) + operator()(T_arg... _A_a) + { return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<type_trait_take_t<T_type>...> + (static_cast<T_type>(_A_a)...); + } /** Constructs a retype_functor object that performs C-style casts on the parameters passed on to the functor. * @param _A_functor Functor to invoke from operator()(). @@ -143,12 +131,12 @@ FOR(0,CALL_SIZE,[[RETYPE_OPERATOR(%1)]])dnl * * @ingroup retype */ -template <LIST(class T_functor, LOOP(class T_type%1, CALL_SIZE))> -struct visitor<retype_functor<LIST(T_functor, LOOP(T_type%1, CALL_SIZE))> > +template <class T_functor, class... T_type> +struct visitor<retype_functor<T_functor, T_type...> > { template <typename T_action> static void do_visit_each(const T_action& _A_action, - const retype_functor<LIST(T_functor, LOOP(T_type%1, CALL_SIZE))>& _A_target) + const retype_functor<T_functor, T_type...>& _A_target) { sigc::visit_each(_A_action, _A_target.functor_); } @@ -184,15 +172,14 @@ retype(const pointer_functor<T_return, T_arg...>& _A_functor) { return retype_functor<pointer_functor<T_return, T_arg...>, T_arg... > (_A_functor); } - -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[const_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[volatile_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[const_volatile_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[bound_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[bound_const_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[bound_volatile_])]])dnl -FOR(0,CALL_SIZE,[[RETYPE_MEM_FUNCTOR(%1,[bound_const_volatile_])]])dnl +RETYPE_MEM_FUNCTOR([]) +RETYPE_MEM_FUNCTOR([const_]) +RETYPE_MEM_FUNCTOR([volatile_]) +RETYPE_MEM_FUNCTOR([const_volatile_]) +RETYPE_MEM_FUNCTOR([bound_]) +RETYPE_MEM_FUNCTOR([bound_const_]) +RETYPE_MEM_FUNCTOR([bound_volatile_]) +RETYPE_MEM_FUNCTOR([bound_const_volatile_]) } /* namespace sigc */ |