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> ©) { return *this; }
+ WeakRef(const WeakRef<ClassName> ©) {}
+
+ 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