00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef COBSTACK_HPP
00032 #define COBSTACK_HPP
00033
00034 #include "glue.h"
00035 #include <vector>
00036 using namespace std;
00037
00044 class CObstack
00045 {
00046 private:
00047
00051 typedef struct obstackChunk_tag {
00052 struct obstackChunk_tag *next;
00053 long size;
00054 long objectOffset;
00055 long freeOffset;
00056 char data[4];
00057 } Chunk_t;
00058
00059 static const int OBSTACK_DEFAULT_BLOCK_SIZE =
00060 1024*64;
00061
00062 Chunk_t* currentChunk;
00063 long alignment;
00064 long defaultSize;
00065
00066 public:
00070 CObstack();
00075 CObstack( int chunkSize );
00079 ~CObstack( void );
00085 void* Alloc( INT32 size );
00090 void Free( void* object );
00097 void* GetBase( void );
00104 void* NextFree( void );
00111 void* Finish( void );
00118 void* Copy( const void* ptr, INT32 size );
00126 void* Copy0( const void* ptr, INT32 size );
00131 INT32 GetObjectSize( void );
00138 void Grow( const void* ptr, INT32 size );
00144 void Grow( INT32 size );
00150 void PtrGrow( void* ptr );
00156 int IsOwner( void* ptr );
00157 private:
00161 void* GrowChunk( INT32 );
00165 };
00166
00174 template<class T>
00175 inline T** Finalize( CObstack* heap, vector<T*>& v )
00176 {
00177 typename vector<T*>::iterator ptr;
00178
00179 for( ptr = v.begin(); ptr != v.end(); ++ptr ) {
00180 heap->Grow( &*ptr, sizeof(T*) );
00181 }
00182 heap->PtrGrow(NULL);
00183 v.erase( v.begin(), v.end() );
00184 return (T**)heap->Finish();
00185 }
00186
00187
00188 #endif // COBSTACK_HPP