Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

EStringPool.h

Go to the documentation of this file.
00001 #ifndef ESTRINGPOOL_H 00002 #define ESTRINGPOOL_H 00003 00004 //using namespace Borealis; // ??? 00005 BOREALIS_NAMESPACE_BEGIN 00006 00015 class EStringPool { 00016 public: 00020 EStringPool(unsigned int initial_size = DEFAULT_INITIAL_SIZE) : 00021 _data(static_cast<char*>(malloc(initial_size))), 00022 _offset(0), 00023 _size(initial_size) 00024 { 00025 ASSERT(_size); 00026 } 00027 00029 ~EStringPool() 00030 { 00031 reset(); 00032 free(_data); 00033 } 00034 00036 void reset() { 00037 if (!_to_delete.empty()) { 00038 for (vector<char*>::iterator i = _to_delete.begin(); i < _to_delete.end(); ++i) 00039 free(*i); 00040 00041 _to_delete.clear(); 00042 } 00043 } 00044 00049 char *alloc(unsigned int size) { 00050 // Round size up to multiple of 8 bytes 00051 size = (size + 7) & ~7; 00052 00053 if (_offset + size > _size) { 00054 _to_delete.push_back(_data); 00055 00056 do { 00057 _size <<= 1; 00058 } while (_size < 2 * (_offset + size)); 00059 00060 _data = static_cast<char*>(malloc(_size)); 00061 _offset = size; 00062 00063 return _data; 00064 } else { 00065 char *ret = _data + _offset; 00066 _offset += size; 00067 return ret; 00068 } 00069 } 00070 00072 static const unsigned int DEFAULT_INITIAL_SIZE = 10240; 00073 00074 private: 00075 char *_data; 00076 unsigned int _offset; 00077 unsigned int _size; 00078 00079 vector<char*> _to_delete; 00080 }; 00081 00082 BOREALIS_NAMESPACE_END 00083 #endif // ESTRINGPOOL_H

Generated on Fri Nov 12 15:15:20 2004 for Borealis by doxygen 1.3.8