Update of /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30607/thread_safe_signals
Modified Files:
slot.hpp track.hpp
Log Message:
Added support for 2-argument form of signalslib::track(), which allows
value and shared_ptr to be specified independantly.
Index: track.hpp
===================================================================
RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/track.hpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- track.hpp 21 Feb 2007 15:15:23 -0000 1.7
+++ track.hpp 22 Feb 2007 16:57:12 -0000 1.8
@@ -12,10 +12,7 @@
#ifndef BOOST_SIGNALS_TRACK_HEADER
#define BOOST_SIGNALS_TRACK_HEADER
-#include <boost/ref.hpp>
-#include <boost/signals/detail/config.hpp>
#include <boost/smart_ptr.hpp>
-#include <boost/noncopyable.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
@@ -23,12 +20,15 @@
namespace boost {
namespace signalslib {
- // The actual wrapper for tracked shared_ptr-referenced objects.
- template<class T>
- class tracked : public weak_ptr<T>
+ /* a weak_ptr that supports various implicit conversions, so it
+ binds to more types of parameters with boost::bind */
+ template<typename T>
+ class convertible_weak_ptr: public weak_ptr<T>
{
public:
- tracked(const weak_ptr<T>& ptr): weak_ptr<T>(ptr)
+ convertible_weak_ptr(const weak_ptr<T> &ptr): weak_ptr<T>(ptr)
+ {}
+ convertible_weak_ptr(const shared_ptr<T> &ptr): weak_ptr<T>(ptr)
{}
operator T* ()
{
@@ -54,23 +54,53 @@
{
return *shared_ptr<const T>(*this).get();
}
- operator shared_ptr<void> () const
+ };
+ // The actual wrapper for tracked shared_ptr-managed objects.
+ template<typename T>
+ class tracked
+ {
+ public:
+ tracked(const T &value, const shared_ptr<void>& tracked_ptr):
+ _value(value), _tracked_ptr(tracked_ptr)
+ {}
+ // implicit conversions so tracked objects can be bound with bind
+ operator T& ()
{
- return shared_ptr<void>(*this);
+ return _value;
+ }
+ operator const T& () const
+ {
+ return _value;
+ }
+
+ const weak_ptr<void>& get_tracked_ptr() const
+ {
+ return _tracked_ptr;
}
+ private:
+ T _value;
+ weak_ptr<void> _tracked_ptr;
};
// Convenience functions for binders.
- template<class T>
- tracked<T> track(const boost::shared_ptr<T>& ptr) {
- return tracked<T>(ptr);
+ template<typename T>
+ tracked<convertible_weak_ptr<T> > track(const shared_ptr<T>& ptr) {
+ return tracked<convertible_weak_ptr<T> >(weak_ptr<T>(ptr), ptr);
}
- template<class T>
- tracked<T> track(const boost::weak_ptr<T>& ptr) {
- return tracked<T>(ptr);
+ template<typename T>
+ tracked<convertible_weak_ptr<T> > track(const weak_ptr<T>& ptr) {
+ return tracked<convertible_weak_ptr<T> >(ptr, ptr.lock());
+ }
+ template<typename T>
+ tracked<T> track(const T &value, const shared_ptr<void> &tracked_ptr) {
+ return tracked<T>(value, tracked_ptr);
}
// get_pointer lets mem_fn bind a tracked
template<typename T>
- T* get_pointer(const signalslib::tracked<T> &tracked) {return shared_ptr<T>(tracked).get();}
+ T* get_pointer(const signalslib::tracked<T*> &tracked) {return tracked;}
+ template<typename T>
+ T* get_pointer(const signalslib::tracked<weak_ptr<T> > &tracked) {return shared_ptr<T>(static_cast<weak_ptr<T> >(tracked)).get();}
+ template<typename T>
+ T* get_pointer(const signalslib::tracked<convertible_weak_ptr<T> > &tracked) {return shared_ptr<T>(static_cast<weak_ptr<T> >(tracked)).get();}
} // end namespace BOOST_SIGNALS_NAMESPACE
} // end namespace boost
Index: slot.hpp
===================================================================
RCS file: /cvsroot/boost-sandbox/boost-sandbox/boost/thread_safe_signals/slot.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- slot.hpp 21 Feb 2007 20:28:14 -0000 1.12
+++ slot.hpp 22 Feb 2007 16:57:12 -0000 1.13
@@ -98,13 +98,13 @@
template<typename GroupKey, typename SlotFunction>
friend class ConnectionBody;
- void add_tracked(const shared_ptr<void> &tracked)
- {
- _trackedObjects.push_back(tracked);
- }
private:
typedef std::vector<boost::weak_ptr<void> > tracked_objects_container;
+ void add_tracked(const weak_ptr<void> &tracked)
+ {
+ _trackedObjects.push_back(tracked);
+ }
const tracked_objects_container& get_all_tracked() const {return _trackedObjects;}
tracked_objects_container _trackedObjects;
@@ -176,7 +176,7 @@
void boost::signalslib::detail::tracked_objects_visitor::add_if_trackable(const tracked<T> *t) const
{
if(t)
- slot_->add_tracked(*t);
+ slot_->add_tracked(t->get_tracked_ptr());
}
void boost::signalslib::detail::tracked_objects_visitor::add_if_trackable(const trackable *trackable) const
{
|