Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_REFARR_H__
00021 #define __CS_REFARR_H__
00022
00027
00028
00029
00030
00031
00032
00033 #include "csutil/array.h"
00034 #include "csutil/ref.h"
00035
00036 #ifdef CS_REF_TRACKER
00037 #include <typeinfo>
00038 #include "csutil/reftrackeraccess.h"
00039
00040 #define CSREFARR_TRACK(x, cmd, refCount, obj, tag) \
00041 { \
00042 const int rc = obj ? refCount : -1; \
00043 if (obj) cmd; \
00044 if (obj) \
00045 { \
00046 csRefTrackerAccess::SetDescription (obj, \
00047 typeid(T).name()); \
00048 csRefTrackerAccess::Match ## x (obj, rc, tag);\
00049 } \
00050 }
00051 #define CSREFARR_TRACK_INCREF(obj,tag) \
00052 CSREFARR_TRACK(IncRef, obj->IncRef(), obj->GetRefCount(), obj, tag);
00053 #define CSREFARR_TRACK_DECREF(obj,tag) \
00054 CSREFARR_TRACK(DecRef, obj->DecRef(), obj->GetRefCount(), obj, tag);
00055 #else
00056 #define CSREFARR_TRACK_INCREF(obj,tag) \
00057 if (obj) obj->IncRef();
00058 #define CSREFARR_TRACK_DECREF(obj,tag) \
00059 if (obj) obj->DecRef();
00060 #endif
00061
00062 template <class T>
00063 class csRefArrayElementHandler : public csArrayElementHandler<T>
00064 {
00065 public:
00066 static void Construct (T* address, T const& src)
00067 {
00068 *address = src;
00069 CSREFARR_TRACK_INCREF (src, address);
00070 }
00071
00072 static void Destroy (T* address)
00073 {
00074 CSREFARR_TRACK_DECREF ((*address), address);
00075 }
00076
00077 static void InitRegion (T* address, size_t count)
00078 {
00079 memset (address, 0, count*sizeof (T));
00080 }
00081 };
00082
00091 template <class T,
00092 class Allocator = CS::Container::ArrayAllocDefault,
00093 class CapacityHandler = CS::Container::ArrayCapacityDefault>
00094 class csRefArray :
00095 public csArray<T*, csRefArrayElementHandler<T*>, Allocator, CapacityHandler>
00096 {
00097 public:
00102 csRefArray (int ilimit = 0,
00103 const CapacityHandler& ch = CapacityHandler())
00104 : csArray<T*, csRefArrayElementHandler<T*>, Allocator, CapacityHandler> (
00105 ilimit, ch)
00106 {
00107 }
00108
00110 csRef<T> Pop ()
00111 {
00112 CS_ASSERT (this->GetSize () > 0);
00113 csRef<T> ret = this->Get (this->GetSize () - 1);
00114 SetSize (this->GetSize () - 1);
00115 return ret;
00116 }
00117 };
00118
00119 #undef CSREFARR_TRACK_INCREF
00120 #undef CSREFARR_TRACK_DECREF
00121
00122 #endif // __CS_REFARR_H__