summaryrefslogtreecommitdiff
path: root/sigc++/adaptors/macros/track_obj.h.m4
diff options
context:
space:
mode:
Diffstat (limited to 'sigc++/adaptors/macros/track_obj.h.m4')
-rw-r--r--sigc++/adaptors/macros/track_obj.h.m445
1 files changed, 37 insertions, 8 deletions
diff --git a/sigc++/adaptors/macros/track_obj.h.m4 b/sigc++/adaptors/macros/track_obj.h.m4
index 9f7d8c2..dbce2be 100644
--- a/sigc++/adaptors/macros/track_obj.h.m4
+++ b/sigc++/adaptors/macros/track_obj.h.m4
@@ -50,7 +50,7 @@ FOR(1, $1,[
dnl track_obj_functor[2..CALL_SIZE]. $1 is assumed to be >= 2.
define([TRACK_OBJECT_FUNCTOR],[dnl
/** track_obj_functor$1 wraps a functor and stores $1 references to trackable objects.
- * Use the convenience function track_obj() to create an instance of track_obj_functor$1.
+ * Use the convenience function track_object() to create an instance of track_obj_functor$1.
*
* @tparam T_functor The type of functor to wrap.dnl
FOR(1,$1,[
@@ -111,6 +111,7 @@ FOR(1,$1,[
])dnl end TRACK_OBJECT_VISIT_EACH
define([TRACK_OBJECT],[dnl
+_DEPRECATE_IFDEF_START
/** Creates an adaptor of type sigc::track_obj_functor$1 which wraps a functor.
* @param _A_func Functor that shall be wrapped.dnl
FOR(1,$1,[
@@ -118,6 +119,7 @@ FOR(1,$1,[
* @return Adaptor that executes _A_func() on invocation.
*
* @newin{2,4}
+ * @deprecated Use sigc::track_object() instead.
*
* @ingroup track_obj
*/
@@ -128,26 +130,54 @@ track_obj(const T_functor& _A_func, LOOP(const T_obj%1& _A_obj%1, $1))
return track_obj_functor$1<T_functor, LOOP(T_obj%1, $1)>
(_A_func, LOOP(_A_obj%1, $1));
}
+_DEPRECATE_IFDEF_END
])dnl end TRACK_OBJECT
+define([TRACK_OBJECT2],[dnl
+/** Creates an adaptor of type sigc::track_obj_functor$1 which wraps a functor.
+ * @param _A_func Functor that shall be wrapped.dnl
+FOR(1,$1,[[
+ * @param _A_obj%1 Trackable object, derived directly or indirectly from sigc::trackable.]])
+ * @return Adaptor that executes _A_func() on invocation.
+ *
+ * @newin{2,12}
+ *
+ * @ingroup track_obj
+ */
+template <typename T_functor, LOOP(typename T_obj%1, $1)>
+inline track_obj_functor$1<T_functor, LOOP(T_obj%1, $1)>
+track_object(const T_functor& _A_func, LOOP(const T_obj%1& _A_obj%1, $1))
+{
+ static_assert(LOOP([[std::is_base_of<sigc::trackable, T_obj%1>::value]], $1, [ && ]),
+ "Each trackable object must be derived from sigc::trackable.");
+
+ return track_obj_functor$1<T_functor, LOOP(T_obj%1, $1)>
+ (_A_func, LOOP(_A_obj%1, $1));
+}
+
+])dnl end TRACK_OBJECT2
+
divert(0)dnl
_FIREWALL([ADAPTORS_TRACK_OBJ])
#include <sigc++/adaptors/adaptor_trait.h>
#include <sigc++/limit_reference.h>
+#include <type_traits>
namespace sigc {
-/** @defgroup track_obj track_obj()
- * sigc::track_obj() tracks trackable objects, referenced from a functor.
+/** @defgroup track_obj track_obj(), track_object()
+ * sigc::track_object() tracks trackable objects, referenced from a functor.
* It can be useful when you assign a C++11 lambda expression or a std::function<>
* to a slot, or connect it to a signal, and the lambda expression or std::function<>
* contains references to sigc::trackable derived objects.
*
- * The functor returned by sigc::track_obj() is formally an adaptor, but it does
+ * The functor returned by sigc::track_object() is formally an adaptor, but it does
* not alter the signature, return type or behaviour of the supplied functor.
* Up to CALL_SIZE objects can be tracked. operator()() can have up to CALL_SIZE arguments.
*
+ * track_obj() is a deprecated alternative to track_object().
+ *
* @par Example:
* @code
* struct bar : public sigc::trackable {};
@@ -157,18 +187,16 @@ namespace sigc {
* bar some_bar;
* some_signal.connect([[&some_bar]](){ foo(some_bar); });
* // NOT disconnected automatically when some_bar goes out of scope
- * some_signal.connect(sigc::track_obj([[&some_bar]](){ foo(some_bar); }, some_bar);
+ * some_signal.connect(sigc::track_object([[&some_bar]](){ foo(some_bar); }, some_bar);
* // disconnected automatically when some_bar goes out of scope
* }
* @endcode
*
- * @newin{2,4}
- *
* @ingroup adaptors
*/
/** track_obj_functor1 wraps a functor and stores a reference to a trackable object.
- * Use the convenience function track_obj() to create an instance of track_obj_functor1.
+ * Use the convenience function track_object() to create an instance of track_obj_functor1.
*
* @tparam T_functor The type of functor to wrap.
* @tparam T_obj1 The type of a trackable object.
@@ -221,5 +249,6 @@ FOR(1,CALL_SIZE,[[TRACK_OBJECT_VISIT_EACH(%1)]])dnl
#endif // DOXYGEN_SHOULD_SKIP_THIS
FOR(1,CALL_SIZE,[[TRACK_OBJECT(%1)]])dnl
+FOR(1,CALL_SIZE,[[TRACK_OBJECT2(%1)]])dnl
} /* namespace sigc */