00001 #ifndef _CARTESIANHEAP_H_
00002 #define _CARTESIANHEAP_H_
00003
00004
00005
00006
00007
00008
00009
00010 template <class SuperHeap>
00011 class CartesianHeap : public SuperHeap {
00012
00013
00014 class MyTreap : public Treap<size_t, void *> {
00015 public:
00016
00017 };
00018
00019 public:
00020
00021 ~CartesianHeap (void) {
00022
00023
00024 }
00025
00026 void * malloc (size_t sz) {
00027
00028 sz = (sz < sizeof(MyTreap::Node)) ? sizeof(MyTreap::Node) : sz;
00029 MyTreap::Node * n = (MyTreap::Node *) treap.lookupGreater (sz);
00030 if (n != NULL) {
00031 assert (n->getValue() == (void *) n);
00032 void * ptr = n->getValue();
00033 treap.remove (n);
00034
00035 return ptr;
00036 } else {
00037 return SuperHeap::malloc (sz);
00038 }
00039 }
00040
00041 void free (void * ptr) {
00042
00043
00044 MyTreap::Node * n = (MyTreap::Node *) ptr;
00045 treap.insert (n, getSize(ptr), ptr, (unsigned int) ptr);
00046 }
00047
00048
00049 void remove (void * ptr) {
00050 treap.remove ((MyTreap::Node *) ptr);
00051 }
00052
00053 private:
00054
00055 MyTreap treap;
00056
00057 };
00058
00059 #endif // _CARTESIANHEAP_H_