Eneboo - Documentación para desarrolladores
src/hoard/src/heaplayers/unique.h
Ir a la documentación de este archivo.
00001 /* -*- C++ -*- */
00002 
00003 #ifndef _UNIQUEHEAP_H_
00004 #define _UNIQUEHEAP_H_
00005 
00006 #include <cstdlib>
00007 #include <new>
00008 
00017 template <class SuperHeap, class Child = int>
00018 class UniqueHeap {
00019 public:
00020 
00025   UniqueHeap (void) 
00026   {
00027     volatile SuperHeap * forceCreationOfSuperHeap = getSuperHeap();
00028     addRef();
00029   }
00030 
00036   ~UniqueHeap (void) {
00037     int r = delRef();
00038     if (r <= 0) {
00039       getSuperHeap()->SuperHeap::~SuperHeap();
00040     }
00041   }
00042 
00043   // The remaining public methods are just
00044   // thin wrappers that route calls to the static object.
00045 
00046   inline void * malloc (size_t sz) {
00047     return getSuperHeap()->malloc (sz);
00048   }
00049   
00050   inline void free (void * ptr) {
00051     getSuperHeap()->free (ptr);
00052   }
00053   
00054   inline size_t getSize (void * ptr) {
00055     return getSuperHeap()->getSize (ptr);
00056   }
00057 
00058   inline int remove (void * ptr) {
00059     return getSuperHeap()->remove (ptr);
00060   }
00061 
00062   inline void clear (void) {
00063     getSuperHeap()->clear();
00064   }
00065 
00066 #if 0
00067   inline int getAllocated (void) {
00068     return getSuperHeap()->getAllocated();
00069   }
00070 
00071   inline int getMaxAllocated (void) {
00072     return getSuperHeap()->getMaxAllocated();
00073   }
00074 
00075   inline int getMaxInUse (void) {
00076     return getSuperHeap()->getMaxInUse();
00077   }
00078 #endif
00079 
00080 private:
00081 
00083   void addRef (void) {
00084     getRefs() += 1;
00085   }
00086 
00088   int delRef (void) {
00089     getRefs() -= 1;
00090     return getRefs();
00091   }
00092 
00094   int& getRefs (void) {
00095     static int numRefs = 0;
00096     return numRefs;
00097   }
00098 
00099   SuperHeap * getSuperHeap (void) {
00100     static char superHeapBuffer[sizeof(SuperHeap)];
00101     static SuperHeap * aSuperHeap = (SuperHeap *) (new ((char *) &superHeapBuffer) SuperHeap);
00102     return aSuperHeap;
00103   }
00104 
00105   void doNothing (Child *) {}
00106 };
00107 
00108 
00109 #endif // _UNIQUE_H_
 Todo Clases Namespaces Archivos Funciones Variables 'typedefs' Enumeraciones Valores de enumeraciones Propiedades Amigas 'defines'