00001
#ifndef ESTRINGPOOL_H
00002
#define ESTRINGPOOL_H
00003
00004
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
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