|
From: Frank M. H. <fm...@us...> - 2007-02-22 16:57:27
|
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 { |