
Peter Dimov wrote:
Eric Niebler wrote:
The implementation is quite trivial (see below).
Seems pretty complicated to me. The "canonical" counted_base is (assuming namespace boost):
class counted_base { private:
mutable detail::atomic_count count_;
protected:
counted_base(): count_( 0 ) {} virtual ~counted_base() {}
Using CRTP (as in the code I posted) avoids the need for a virtual destructor. I see no need to force the virtual on people.
counted_base( counted_base const & ): count_( 0 ) {} counted_base& operator=( counted_base const & ) { return *this; }
Huh. I was thinking it was safer to make these guys noncopyable, but ok.
public:
inline friend void intrusive_ptr_add_ref( counted_base const * p ) { ++p->count_; }
inline friend void intrusive_ptr_release( counted_base const * p ) { if( --p->count_ == 0 ) delete p; }
Tried that. Under certain circumstances, VC7.1 wasn't finding the friend functions. Hence my counted_base_access hack, and the intrusive_ptr_add_ref/release functions at namespace scope.
long use_count() const { return count_; }
Sure.
};
Seeing so many variations of it is a pretty good indication that we need it in Boost. :-)
So you're going to add it? :-) -- Eric Niebler Boost Consulting www.boost-consulting.com