00001 #ifndef _BUMPALLOC_H_
00002 #define _BUMPALLOC_H_
00003
00010 namespace Hoard {
00011
00012 template <int ChunkSize,
00013 class super>
00014 class BumpAlloc : public super {
00015 public:
00016
00017 BumpAlloc (void)
00018 : _bump (NULL),
00019 _remaining (0)
00020 {}
00021
00022 inline void * malloc (size_t sz) {
00023
00024
00025 if (_remaining < sz) {
00026 refill(sz);
00027 }
00028 if (_bump) {
00029 char * old = _bump;
00030 _bump += sz;
00031 _remaining -= sz;
00032 return old;
00033 } else {
00034
00035 return NULL;
00036 }
00037 }
00038
00040 inline void free (void *) {}
00041
00042 private:
00043
00045 char * _bump;
00046
00048 size_t _remaining;
00049
00050
00051 void refill (size_t sz) {
00052
00053 if (sz < ChunkSize) {
00054 sz = ChunkSize;
00055 }
00056 _bump = (char *) super::malloc (sz);
00057 if (_bump) {
00058 _remaining = sz;
00059 } else {
00060 _remaining = 0;
00061 }
00062 }
00063
00064 };
00065
00066 }
00067
00068 #endif