Boost logo

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