00001
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