Eneboo - Documentación para desarrolladores
|
00001 /* -*- C++ -*- */ 00002 00003 #ifndef _HYBRIDHEAP_H_ 00004 #define _HYBRIDHEAP_H_ 00005 00006 #include <assert.h> 00007 #include "sassert.h" 00008 #include "hldefines.h" 00009 00016 namespace HL { 00017 00018 template <int BigSize, class SmallHeap, class BigHeap> 00019 class HybridHeap : public SmallHeap { 00020 public: 00021 00022 HybridHeap (void) 00023 { 00024 } 00025 00026 enum { Alignment = ((int) SmallHeap::Alignment < (int) BigHeap::Alignment) ? 00027 (int) SmallHeap::Alignment : 00028 (int) BigHeap::Alignment }; 00029 00030 MALLOC_FUNCTION INLINE void * malloc (size_t sz) { 00031 if (sz <= BigSize) { 00032 return SmallHeap::malloc (sz); 00033 } else { 00034 return slowPath (sz); 00035 } 00036 } 00037 00038 inline void free (void * ptr) { 00039 if (SmallHeap::getSize(ptr) <= BigSize) { 00040 SmallHeap::free (ptr); 00041 } else { 00042 bm.free (ptr); 00043 } 00044 } 00045 00046 inline void clear (void) { 00047 bm.clear(); 00048 SmallHeap::clear(); 00049 } 00050 00051 00052 private: 00053 00054 MALLOC_FUNCTION NO_INLINE 00055 void * slowPath (size_t sz) { 00056 return bm.malloc (sz); 00057 } 00058 00059 00060 HL::sassert<(BigSize > 0)> checkBigSizeNonZero; 00061 00062 BigHeap bm; 00063 }; 00064 00065 } 00066 00067 #endif