00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00015 #ifndef __FIX_ALLOC_HPP__
00016 #define __FIX_ALLOC_HPP__
00017
00018 #include <stddef.h>
00019
00021 namespace fixed_alloc_private {
00022
00030 void get_mem(void*& head, size_t type_sz);
00031
00038 template <size_t SIZE>
00039 class void_alloc {
00041 static void* head;
00042
00043 public:
00045 static void* alloc()
00046 {
00047 if (!head) get_mem(head, SIZE);
00048
00049 void* ret=head;
00050 head=*(void**)head;
00051
00052 return ret;
00053 }
00054
00056 static void free(void* ptr)
00057 {
00058 *(void**)ptr=head;
00059 head=ptr;
00060 }
00061 };
00062
00064 template <size_t SIZE>
00065 void* void_alloc<SIZE>::head;
00066
00067 }
00068
00076 template <class T>
00077 class fixed_alloc {
00078 public:
00083 enum { SIZE=(sizeof(T)+sizeof(void*)-1)/sizeof(void*)*sizeof(void*) };
00084
00089 static T* alloc()
00090 {
00091 return (T*)fixed_alloc_private::void_alloc<SIZE>::alloc();
00092 }
00093
00109 static void free(void* ptr)
00110 {
00111 fixed_alloc_private::void_alloc<SIZE>::free(ptr);
00112 }
00113 };
00114
00128 class sized_alloc {
00129 public:
00137 static void* alloc(size_t size);
00138
00146 static void free(void* ptr, size_t size);
00147 };
00148
00149 #endif