On 12/1/06, Nat Goodspeed <ngoodspeed@solidworks.com> wrote:
It seems possible to implement weak_ptr notification by building a list
of weak_ptr instances referencing a given object. If we don't want that
list to consume additional heap memory, the list could itself be
intrusive in the weak_ptr objects. If we want it to be efficient, we
build a doubly-linked list. (This may call for a policy-based
implementation so the consumer can decide which overhead is least
noxious.)

Interestingly, since you define the intrusive_ptr_add_ref and release, you can probably implement the list management without changing intrusive_ptr.

Would you prefer to have the list of weak_ptrs kept on the intrusive_ptr (on the actual 'intruded' object, actually), or have a global map of intrusive_ptr object to weak_ptr list?

ie

void intrusive_ptr_release(MyPointer *p)
{
   decr_refcount(p);

   if (refcount(p) == 0)
   {
      weak_ptr_list weaklist = ???  // where does the list come from? from p? global?

      for_each_weak_ptr_notify_object_gone(weaklist);

      delete p;
   }

}


Tony