|
Boost Users : |
From: Gennadiy Rozental (rogeeff_at_[hidden])
Date: 2008-07-31 18:10:17
Alexander Gutenev <gutenev <at> gmail.com> writes:
>
> Updated, after looking into other's implementation:
I would add IncrementPolicy with following default.
struct trivial_increment_policy {
void inc( long& c ) { ++c; }
bool dec( long& c ) { return --c == 0; }
}
> template<class Derived>
template<class Derived, template IncrementPolicy=trivial_increment_policy>
> class intrusive_pointee_base
> {
> private:
> typedef intrusive_pointee_base self;
>
> protected:
> intrusive_pointee_base(void) : reference_counter_(0) {}
> intrusive_pointee_base(self const&) : reference_counter_(0) {}
> intrusive_pointee_base operator=(self const&) { return *this }
> ~intrusive_pointee_base(void) {}
>
> private:
> friend void intrusive_ptr_add_ref(const Derived * p)
> {
IncrementPolicy::inc(&static_cast<self const
> *>(p)->reference_counter_);
> }
>
> friend void intrusive_ptr_release(const Derived * p)
> {
if(!IncrementPolicy::dec(
&static_cast<self const>*>(p)->reference_counter_))
> delete p;
> }
>
> mutable volatile long reference_counter_;
> };
>
Now you can add your own
struct nt_mt_safe_increment {
void inc( long& c ) { ::InterlockedIncrement(c); }
bool dec( long& c ) { return ::InterlockedDecrement(--c) == 0; }
};
Gennadiy
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net