Update of /cvsroot/mahogany/M/include
In directory sc8-pr-cvs1:/tmp/cvs-serv25005/include

Modified Files:
        MObject.h pointers.h 
Log Message:
Resolved conflicts in pointers.h and added (not yet usable) WeakPtr

Index: MObject.h
===================================================================
RCS file: /cvsroot/mahogany/M/include/MObject.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -b -u -2 -r1.29 -r1.30
--- MObject.h   27 Sep 2003 17:18:06 -0000      1.29
+++ MObject.h   9 Oct 2003 16:39:09 -0000       1.30
@@ -16,4 +16,17 @@
 #define   MOBJECT_H
 
+class WeakRefCounter;
+class MObjectRC;
+
+// ----------------------------------------------------------------------------
+// Private smart pointer helpers
+// ----------------------------------------------------------------------------
+
+extern void RefCounterIncrement(MObjectRC *pointer);
+extern void RefCounterDecrement(MObjectRC *pointer);
+extern void RefCounterAssign(MObjectRC *target,MObjectRC *source);
+extern WeakRefCounter *WeakRefAdd(MObjectRC *pointer);
+extern void WeakRefDeleted(WeakRefCounter *counter);
+
 // ----------------------------------------------------------------------------
 // MObject: the mother of all classes
@@ -136,5 +149,5 @@
   MObjectRC();
 #else
-  MObjectRC() { m_nRef = 1; }
+  MObjectRC() { m_nRef = 1; m_weak = 0; }
 #endif
 
@@ -173,5 +186,6 @@
 protected:
    //// dtor is protected because only DecRef() can delete us
-   virtual ~MObjectRC() { MOcheck(); wxASSERT(m_nRef == 0); }
+   virtual ~MObjectRC()
+      { MOcheck(); wxASSERT(m_nRef == 0); WeakRefDeleted(m_weak); }
    //// return the reference count:
    size_t GetNRef(void) const { return m_nRef; }
@@ -181,4 +195,8 @@
 
    size_t m_nRef;  // always > 0 - as soon as it becomes 0 we delete ourselves
+
+   // Support for WeakRef
+   friend WeakRefCounter *WeakRefAdd(MObjectRC *pointer);
+   WeakRefCounter *m_weak;
 };
 

Index: pointers.h
===================================================================
RCS file: /cvsroot/mahogany/M/include/pointers.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -b -u -2 -r1.4 -r1.5
--- pointers.h  9 Oct 2003 14:13:40 -0000       1.4
+++ pointers.h  9 Oct 2003 16:39:09 -0000       1.5
@@ -3,4 +3,6 @@
 // File name:   pointers.h
 // Purpose:     Memory management, mostly templates and macros
+//              While MObject.h is for *defining* objects, pointers.h
+//              is for *referencing* objects, so keep it short
 // Author:      Robert Vazan
 // Modified by:
@@ -14,4 +16,8 @@
 #define M_POINTERS_H
 
+class WeakRefCounter;
+
+extern void WeakRefRemove(WeakRefCounter *counter);
+
 /**
    An MObjectRC-based smart pointer implementation.
@@ -128,25 +134,33 @@
 };
 
-#define DECLARE_REF_COUNTER(T) \
-   class T; \
-   extern void RefCounterIncrement(T *pointer); \
-   extern void RefCounterDecrement(T *pointer); \
-   extern void RefCounterAssign(T *target,T *source);
 
-#define DEFINE_REF_COUNTER(T) \
-   extern void RefCounterIncrement(T *pointer) \
-      { RefCounterIncrement(static_cast<MObjectRC *>(pointer)); } \
-   extern void RefCounterDecrement(T *pointer) \
-      { RefCounterDecrement(static_cast<MObjectRC *>(pointer)); } \
-   extern void RefCounterAssign(T *target,T *source) \
-   { \
-      RefCounterAssign(static_cast<MObjectRC *>(target), \
-         static_cast<MObjectRC *>(source)); \
+// Used to resolve cyclic references. RefCounter goes in one direction
+// and WeakRef goes in the opposite direction. WeakRef (seems that it)
+// contains NULL if all RefCounter instances are gone (and the object
+// is deleted).
+template <class ClassName>
+class WeakRef
+{
+public:
+   WeakRef() { InitNull(); }
+   WeakRef(RefCounter<ClassName> pointer) { Init(pointer); }
+   ~WeakRef() { Destroy(); }
+
+private:
+   // not implemented
+   WeakRef<ClassName> operator=(const WeakRef<ClassName> &copy) { return *this; }
+   WeakRef(const WeakRef<ClassName> &copy) {}
+
+   void InitNull() { m_pointer = 0; m_counter = 0; }
+   void Init(RefCounter<ClassName> pointer)
+   {
+      m_pointer = static_cast<ClassName *>(pointer);
+      m_counter = WeakRefAdd(m_pointer);
    }
+   void Destroy() { WeakRefRemove(m_counter); }
 
-class MObjectRC;
-extern void RefCounterIncrement(MObjectRC *pointer);
-extern void RefCounterDecrement(MObjectRC *pointer);
-extern void RefCounterAssign(MObjectRC *target,MObjectRC *source);
+   ClassName *m_pointer;
+   WeakRefCounter *m_counter;
+};
 
 
@@ -181,4 +195,31 @@
    void operator=(const AutoPtr<T>& copy) {}
 };
+
+
+// Use instead of forward declaration to make RefCounter and WeakRef
+// instantiable without knowledge that ClassName derives from MObjectRC.
+#define DECLARE_REF_COUNTER(T) \
+   class T; \
+   extern void RefCounterIncrement(T *pointer); \
+   extern void RefCounterDecrement(T *pointer); \
+   extern void RefCounterAssign(T *target,T *source); \
+   extern WeakRefCounter *WeakRefAdd(T *pointer);
+
+
+// If DECLARE_REF_COUNTER is used anywhere, DEFINE_REF_COUNTER must be
+// put it some *.cpp file that #includes ClassName's header.
+#define DEFINE_REF_COUNTER(T) \
+   extern void RefCounterIncrement(T *pointer) \
+      { RefCounterIncrement(static_cast<MObjectRC *>(pointer)); } \
+   extern void RefCounterDecrement(T *pointer) \
+      { RefCounterDecrement(static_cast<MObjectRC *>(pointer)); } \
+   extern void RefCounterAssign(T *target,T *source) \
+   { \
+      RefCounterAssign(static_cast<MObjectRC *>(target), \
+         static_cast<MObjectRC *>(source)); \
+   } \
+   extern WeakRefCounter *WeakRefAdd(T *pointer) \
+      { return WeakRefAdd(static_cast<MObjectRC *>(pointer)); }
+
 
 #endif // M_POINTERS_H



-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
_______________________________________________
Mahogany-cvsupdates mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates

Reply via email to