00001 #ifndef _THEAP_H_
00002 #define _THEAP_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 template <class SuperHeap, class FH, int Threshold>
00013 class THeap : public SuperHeap {
00014 public:
00015 THeap (void)
00016 : total (0)
00017 {}
00018
00019 ~THeap (void)
00020 {}
00021
00022 inline void * malloc (size_t sz) {
00023 void * ptr;
00024 ptr = fHeap.malloc (sz);
00025 if (ptr == NULL) {
00026
00027
00028 ptr = SuperHeap::malloc (sz);
00029 } else {
00030 total -= size(ptr);
00031
00032 }
00033 assert (size(ptr) >= sz);
00034 return ptr;
00035 }
00036
00037 inline void free (void * ptr) {
00038 if (total < Threshold) {
00039
00040 total += size(ptr);
00041 fHeap.free (ptr);
00042
00043 } else {
00044
00045 void * p = fHeap.malloc (1);
00046 while (p != NULL) {
00047 SuperHeap::free (p);
00048 p = fHeap.malloc (1);
00049 }
00050 SuperHeap::free (ptr);
00051 total = 0;
00052 }
00053 }
00054
00055 private:
00056
00057 FH fHeap;
00058 int total;
00059 };
00060
00061
00062 #endif