summaryrefslogtreecommitdiff
path: root/libs/sigc++2/sigc++/trackable.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/sigc++2/sigc++/trackable.h')
-rw-r--r--libs/sigc++2/sigc++/trackable.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/libs/sigc++2/sigc++/trackable.h b/libs/sigc++2/sigc++/trackable.h
new file mode 100644
index 0000000000..4563738dd6
--- /dev/null
+++ b/libs/sigc++2/sigc++/trackable.h
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2002, The libsigc++ Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+#ifndef _SIGC_TRACKABLE_HPP_
+#define _SIGC_TRACKABLE_HPP_
+#include <list>
+#include <sigc++config.h>
+
+namespace sigc {
+
+namespace internal {
+
+typedef void* (*func_destroy_notify) (void* data);
+
+/** Destroy notification callback.
+ * A destroy notification callback consists of a data pointer and a
+ * function pointer. The function is executed from the owning callback
+ * list (of type sigc::internal::trackable_callback_list) when its parent
+ * object (of type sigc::trackable) is destroyed or overwritten.
+ */
+struct SIGC_API trackable_callback
+{
+ void* data_;
+ func_destroy_notify func_;
+ trackable_callback(void* data, func_destroy_notify func)
+ : data_(data), func_(func) {}
+};
+
+/** Callback list.
+ * A callback list holds an STL list of callbacks of type
+ * trackable_callback. Callbacks are added and removed with
+ * add_callback(), remove_callback() and clear(). The callbacks
+ * are invoked from clear() and from the destructor.
+ */
+struct SIGC_API trackable_callback_list
+{
+ /** Add a callback function.
+ * @param data Data that will be sent as a parameter to teh callback function.
+ * @param func The callback function.
+ *
+ */
+ void add_callback(void* data, func_destroy_notify func);
+
+ /** Remove the callback which has this data associated with it.
+ * @param data The data that was given as a parameter to add_callback().
+ */
+ void remove_callback(void* data);
+
+ /** This invokes all of the callback functions.
+ */
+ void clear();
+
+ trackable_callback_list()
+ : clearing_(false) {}
+
+ /** This invokes all of the callback functions.
+ */
+ ~trackable_callback_list();
+
+private:
+ typedef std::list<trackable_callback> callback_list;
+ callback_list callbacks_;
+ bool clearing_;
+};
+
+} /* namespace internal */
+
+
+/** Base class for objects with auto-disconnection.
+ * trackable must be inherited when objects shall automatically
+ * invalidate slots referring to them on destruction.
+ * A slot built from a member function of a trackable derived
+ * type installs a callback that is invoked when the trackable object
+ * is destroyed or overwritten.
+ *
+ * add_destroy_notify_callback() and remove_destroy_notify_callback()
+ * can be used to manually install and remove callbacks when
+ * notification of the object dying is needed.
+ *
+ * notify_callbacks() invokes and removes all previously installed
+ * callbacks and can therefore be used to disconnect from all signals.
+ *
+ * Note that there is no virtual destructor. Don't use @p trackable*
+ * as pointer type for managing your data or the destructors of
+ * your derived types won't be called when deleting your objects.
+ *
+ * @ingroup signal
+ */
+struct SIGC_API trackable
+{
+ trackable();
+
+ trackable(const trackable& src);
+
+ trackable& operator=(const trackable& src);
+
+ ~trackable();
+
+ /*virtual ~trackable() {} */ /* we would need a virtual dtor for users
+ who insist on using "trackable*" as
+ pointer type for their own derived objects */
+
+
+ typedef internal::func_destroy_notify func_destroy_notify;
+
+ /** Add a callback that is executed (notified) when the trackable object is detroyed.
+ * @param data Passed into func upon notification.
+ * @param func Callback executed upon destruction of the object.
+ */
+ void add_destroy_notify_callback(void* data, func_destroy_notify func) const;
+
+ /** Remove a callback previously installed with add_destroy_notify_callback().
+ * The callback is not executed.
+ * @param data Parameter passed into previous call to add_destroy_notify_callback().
+ */
+ void remove_destroy_notify_callback(void* data) const;
+
+ /// Execute and remove all previously installed callbacks.
+ void notify_callbacks();
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+private:
+ /* The callbacks are held in a list of type trackable_callback_list.
+ * This list is allocated dynamically when the first callback is added.
+ */
+ internal::trackable_callback_list* callback_list() const;
+ mutable internal::trackable_callback_list* callback_list_;
+#endif
+};
+
+} /* namespace sigc */
+
+#endif /* _SIGC_TRACKABLE_HPP_ */