diff options
| author | Murray Cumming <murrayc@murrayc.com> | 2016-04-13 20:37:34 +0200 |
|---|---|---|
| committer | Murray Cumming <murrayc@murrayc.com> | 2016-04-13 20:37:34 +0200 |
| commit | 276098c1dac0a7755eebdae7654607b01aa65602 (patch) | |
| tree | 85591d5c0098000fe9e6b14f46aa6e2f1dbd6487 /sigc++/adaptors | |
| parent | d63dd840cff6ab8b78798760c8712cbad2e66c36 (diff) | |
| download | sigc++-276098c1dac0a7755eebdae7654607b01aa65602.tar.gz | |
adaptor_trait.h: Move adapts<> into its own file.
To make it clearer what is used by what.
Diffstat (limited to 'sigc++/adaptors')
| -rw-r--r-- | sigc++/adaptors/adaptor_trait.h | 83 | ||||
| -rw-r--r-- | sigc++/adaptors/adapts.h | 92 | ||||
| -rw-r--r-- | sigc++/adaptors/bind.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/bind_return.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/compose.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/exception_catch.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/hide.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/retype.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/retype_return.h | 2 | ||||
| -rw-r--r-- | sigc++/adaptors/track_obj.h | 2 |
10 files changed, 100 insertions, 91 deletions
diff --git a/sigc++/adaptors/adaptor_trait.h b/sigc++/adaptors/adaptor_trait.h index c6d5a86..a552d13 100644 --- a/sigc++/adaptors/adaptor_trait.h +++ b/sigc++/adaptors/adaptor_trait.h @@ -34,11 +34,6 @@ namespace sigc { -#ifndef DOXYGEN_SHOULD_SKIP_THIS -template <class T_functor> -struct adapts; -#endif - /** @defgroup adaptors Adaptors * Adaptors are functors that alter the signature of a functor's * operator()(). @@ -168,83 +163,5 @@ public: using adaptor_type = adaptor_functor<functor_type>; }; -// Doxygen (at least version 1.8.4) removes blank lines in a code block. -// That's why there are empty comment lines in the following code block. -/** Base type for adaptors. - * sigc::adapts wraps adaptors, functors, function pointers and class methods. - * It contains a single member functor which is always a sigc::adaptor_base. - * The adaptor_type alias defines the exact type that is used - * to store the adaptor, functor, function pointer or class method passed - * into the constructor. It differs from @a T_functor unless @a T_functor - * inherits from sigc::adaptor_base. - * - * @par Example of a simple adaptor: - * @code - * namespace my_ns - * { - * template <class T_functor> - * struct my_adaptor : public sigc::adapts<T_functor> - * { - * using result_type = typename sigc::functor_trait<T_functor>::result_type; - * // - * result_type - * operator()() const; - * // - * template <class T_arg1> - * decltype(auto) - * operator()(T_arg1 _A_arg1) const; - * // - * template <class T_arg1, class T_arg2> - * decltype(auto) - * operator()(T_arg1 _A_arg1, T_arg2 _A_arg2) const; - * // - * // Constructs a my_adaptor object that wraps the passed functor. - * // Initializes adapts<T_functor>::functor_, which is invoked from operator()(). - * explicit my_adaptor(const T_functor& _A_functor) - * : sigc::adapts<T_functor>(_A_functor) {} - * }; - * } // end namespace my_ns - * // - * // Specialization of sigc::visitor for my_adaptor. - * namespace sigc - * { - * template <class T_functor> - * struct visitor<my_ns::my_adaptor<T_functor> > - * { - * template <class T_action> - * static void do_visit_each(const T_action& _A_action, - * const my_ns::my_adaptor<T_functor>& _A_target) - * { - * sigc::visit_each(_A_action, _A_target.functor_); - * } - * }; - * } // end namespace sigc - * @endcode - * - * If you implement your own adaptor, you must also provide your specialization - * of sigc::visitor<>::do_visit_each<>() that will forward the call to the functor(s) - * your adapter is wrapping. Otherwise, pointers stored within the functor won't be - * invalidated when a sigc::trackable object is destroyed and you can end up - * executing callbacks on destroyed objects. - * - * Your specialization of sigc::visitor<> must be in namespace sigc. - * - * @ingroup adaptors - */ -template <class T_functor> -struct adapts : public adaptor_base -{ - using result_type = typename adaptor_trait<T_functor>::result_type; - using adaptor_type = typename adaptor_trait<T_functor>::adaptor_type; - - /** Constructs an adaptor that wraps the passed functor. - * @param _A_functor Functor to invoke from operator()(). - */ - explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) {} - - /// Adaptor that is invoked from operator()(). - mutable adaptor_type functor_; -}; - } /* namespace sigc */ #endif /* _SIGC_ADAPTORS_ADAPTOR_TRAIT_H_ */ diff --git a/sigc++/adaptors/adapts.h b/sigc++/adaptors/adapts.h new file mode 100644 index 0000000..0003edc --- /dev/null +++ b/sigc++/adaptors/adapts.h @@ -0,0 +1,92 @@ +#ifndef _SIGC_ADAPTORS_ADAPTS_H_ +#define _SIGC_ADAPTORS_ADAPTS_H_ +#include <sigc++config.h> //To get SIGC_TEMPLATE_KEYWORD_OPERATOR_OVERLOAD +#include <sigc++/visit_each.h> +#include <sigc++/functors/functor_trait.h> +#include <sigc++/functors/ptr_fun.h> +#include <sigc++/functors/mem_fun.h> +#include <sigc++/adaptors/adaptor_trait.h> + +namespace sigc +{ + +// Doxygen (at least version 1.8.4) removes blank lines in a code block. +// That's why there are empty comment lines in the following code block. +/** Base type for adaptors. + * sigc::adapts wraps adaptors, functors, function pointers and class methods. + * It contains a single member functor which is always a sigc::adaptor_base. + * The adaptor_type alias defines the exact type that is used + * to store the adaptor, functor, function pointer or class method passed + * into the constructor. It differs from @a T_functor unless @a T_functor + * inherits from sigc::adaptor_base. + * + * @par Example of a simple adaptor: + * @code + * namespace my_ns + * { + * template <class T_functor> + * struct my_adaptor : public sigc::adapts<T_functor> + * { + * using result_type = typename sigc::functor_trait<T_functor>::result_type; + * // + * result_type + * operator()() const; + * // + * template <class T_arg1> + * decltype(auto) + * operator()(T_arg1 _A_arg1) const; + * // + * template <class T_arg1, class T_arg2> + * decltype(auto) + * operator()(T_arg1 _A_arg1, T_arg2 _A_arg2) const; + * // + * // Constructs a my_adaptor object that wraps the passed functor. + * // Initializes adapts<T_functor>::functor_, which is invoked from operator()(). + * explicit my_adaptor(const T_functor& _A_functor) + * : sigc::adapts<T_functor>(_A_functor) {} + * }; + * } // end namespace my_ns + * // + * // Specialization of sigc::visitor for my_adaptor. + * namespace sigc + * { + * template <class T_functor> + * struct visitor<my_ns::my_adaptor<T_functor> > + * { + * template <class T_action> + * static void do_visit_each(const T_action& _A_action, + * const my_ns::my_adaptor<T_functor>& _A_target) + * { + * sigc::visit_each(_A_action, _A_target.functor_); + * } + * }; + * } // end namespace sigc + * @endcode + * + * If you implement your own adaptor, you must also provide your specialization + * of sigc::visitor<>::do_visit_each<>() that will forward the call to the functor(s) + * your adapter is wrapping. Otherwise, pointers stored within the functor won't be + * invalidated when a sigc::trackable object is destroyed and you can end up + * executing callbacks on destroyed objects. + * + * Your specialization of sigc::visitor<> must be in namespace sigc. + * + * @ingroup adaptors + */ +template <class T_functor> +struct adapts : public adaptor_base +{ + using result_type = typename adaptor_trait<T_functor>::result_type; + using adaptor_type = typename adaptor_trait<T_functor>::adaptor_type; + + /** Constructs an adaptor that wraps the passed functor. + * @param _A_functor Functor to invoke from operator()(). + */ + explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) {} + + /// Adaptor that is invoked from operator()(). + mutable adaptor_type functor_; +}; + +} /* namespace sigc */ +#endif /* _SIGC_ADAPTORS_ADAPTS_H_ */ diff --git a/sigc++/adaptors/bind.h b/sigc++/adaptors/bind.h index fcca3fd..9b2c98c 100644 --- a/sigc++/adaptors/bind.h +++ b/sigc++/adaptors/bind.h @@ -1,6 +1,6 @@ #ifndef _SIGC_ADAPTORS_BIND_H_ #define _SIGC_ADAPTORS_BIND_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> #include <sigc++/adaptors/bound_argument.h> #include <sigc++/adaptors/tuple_visitor_visit_each.h> #include <sigc++/tuple-utils/tuple_for_each.h> diff --git a/sigc++/adaptors/bind_return.h b/sigc++/adaptors/bind_return.h index 0f4f9b1..74c4738 100644 --- a/sigc++/adaptors/bind_return.h +++ b/sigc++/adaptors/bind_return.h @@ -1,6 +1,6 @@ #ifndef _SIGC_ADAPTORS_BIND_RETURN_H_ #define _SIGC_ADAPTORS_BIND_RETURN_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> #include <sigc++/adaptors/bound_argument.h> namespace sigc diff --git a/sigc++/adaptors/compose.h b/sigc++/adaptors/compose.h index 9a6c3e6..5c7aca9 100644 --- a/sigc++/adaptors/compose.h +++ b/sigc++/adaptors/compose.h @@ -1,6 +1,6 @@ #ifndef _SIGC_ADAPTORS_COMPOSE_H_ #define _SIGC_ADAPTORS_COMPOSE_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> namespace sigc { diff --git a/sigc++/adaptors/exception_catch.h b/sigc++/adaptors/exception_catch.h index dd2cb18..519e7cc 100644 --- a/sigc++/adaptors/exception_catch.h +++ b/sigc++/adaptors/exception_catch.h @@ -1,6 +1,6 @@ #ifndef _SIGC_ADAPTORS_EXCEPTION_CATCH_H_ #define _SIGC_ADAPTORS_EXCEPTION_CATCH_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> namespace sigc { diff --git a/sigc++/adaptors/hide.h b/sigc++/adaptors/hide.h index 0628c7c..2fe93b3 100644 --- a/sigc++/adaptors/hide.h +++ b/sigc++/adaptors/hide.h @@ -1,7 +1,7 @@ #ifndef _SIGC_ADAPTORS_HIDE_H_ #define _SIGC_ADAPTORS_HIDE_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> #include <sigc++/tuple-utils/tuple_end.h> #include <sigc++/tuple-utils/tuple_start.h> diff --git a/sigc++/adaptors/retype.h b/sigc++/adaptors/retype.h index 98c2c24..18b3edd 100644 --- a/sigc++/adaptors/retype.h +++ b/sigc++/adaptors/retype.h @@ -1,7 +1,7 @@ #ifndef _SIGC_ADAPTORS_RETYPE_H_ #define _SIGC_ADAPTORS_RETYPE_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> #include <sigc++/functors/ptr_fun.h> #include <sigc++/functors/mem_fun.h> #include <sigc++/functors/slot.h> diff --git a/sigc++/adaptors/retype_return.h b/sigc++/adaptors/retype_return.h index a261b43..5551d92 100644 --- a/sigc++/adaptors/retype_return.h +++ b/sigc++/adaptors/retype_return.h @@ -1,6 +1,6 @@ #ifndef _SIGC_ADAPTORS_RETYPE_RETURN_H_ #define _SIGC_ADAPTORS_RETYPE_RETURN_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> namespace sigc { diff --git a/sigc++/adaptors/track_obj.h b/sigc++/adaptors/track_obj.h index 6b138f4..a79ec2d 100644 --- a/sigc++/adaptors/track_obj.h +++ b/sigc++/adaptors/track_obj.h @@ -1,7 +1,7 @@ #ifndef _SIGC_ADAPTORS_TRACK_OBJ_H_ #define _SIGC_ADAPTORS_TRACK_OBJ_H_ -#include <sigc++/adaptors/adaptor_trait.h> +#include <sigc++/adaptors/adapts.h> #include <sigc++/adaptors/tuple_visitor_visit_each.h> #include <sigc++/limit_reference.h> #include <sigc++/tuple-utils/tuple_for_each.h> |
