00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef BL_CARENA_H
00024 #define BL_CARENA_H
00025
00026 #include <winstd.H>
00027
00028 #if defined(BL_OLD_STL)
00029 #include <stddef.h>
00030 #else
00031 #include <cstddef>
00032 #endif
00033
00034 #include <set>
00035 #include <vector>
00036
00037 #include <Arena.H>
00038 #include <Array.H>
00039
00040
00041
00043
00050 class CArena
00051 :
00052 public Arena
00053 {
00054 public:
00055
00060 CArena (size_t hunk_size = 0);
00061
00063
00064 virtual ~CArena ();
00065
00067
00068 virtual void* alloc (size_t nbytes);
00069
00073 virtual void free (void* ap);
00074
00076
00077 size_t heap_space_used () const;
00078
00080
00081 enum { DefaultHunkSize = 1024*1024 };
00082
00083 protected:
00084
00085
00086
00087 class Node
00088 {
00089 public:
00090
00091
00092
00093 Node ()
00094 :
00095 m_block(0), m_size(0) {}
00096
00097
00098
00099 Node (void* block, size_t size)
00100 :
00101 m_block(block), m_size(size) {}
00102
00103
00104
00105 Node (const Node& rhs)
00106 :
00107 m_block(rhs.m_block), m_size(rhs.m_size) {}
00108
00109
00110
00111 Node& operator= (const Node& rhs)
00112 {
00113 m_block = rhs.m_block;
00114 m_size = rhs.m_size;
00115 return *this;
00116 }
00117
00118
00119
00120 bool operator< (const Node& rhs) const
00121 {
00122 return m_block < rhs.m_block;
00123 }
00124
00125
00126
00127 bool operator== (const Node& rhs) const
00128 {
00129 return m_block == rhs.m_block;
00130 }
00131
00132
00133
00134 void* block () const { return m_block; }
00135
00136
00137
00138 void block (void* blk) { m_block = blk; }
00139
00140
00141
00142 size_t size () const { return m_size; }
00143
00144
00145
00146 void size (size_t sz) { m_size = sz; }
00147
00148 private:
00149
00150
00151
00152 void* m_block;
00153
00154
00155
00156 size_t m_size;
00157 };
00158
00159
00160
00161
00162 typedef std::set<Node> NL;
00163
00164
00165
00166 std::vector<void*> m_alloc;
00167
00168
00169
00170
00171 NL m_freelist;
00172
00173
00174
00175
00176 NL m_busylist;
00177
00178
00179
00180 size_t m_hunk;
00181
00182
00183
00184 size_t m_used;
00185
00186 private:
00187
00188
00189
00190 CArena (const CArena& rhs);
00191 CArena& operator= (const CArena& rhs);
00192 };
00193
00194
00195
00196
00197 extern Arena* The_FAB_Arena;
00198
00199 #endif