25 #include <core/exceptions/system.h>
26 #include <core/exceptions/software.h>
27 #include <netcomm/utils/dynamic_buffer.h>
31 #include <netinet/in.h>
68 _buffer_size = initial_buffer_size;
69 _buffer = malloc(_buffer_size);
70 _curhead = (element_header_t *)_buffer;
71 _curdata = (
void *)((
size_t)_buffer +
sizeof(element_header_t));
95 _curhead = (element_header_t *)_buffer;
96 _curdata = (
void *)((
size_t)_buffer +
sizeof(element_header_t));
98 _it_curhead = _curhead;
99 _it_curdata = _curdata;
109 if (! _read_only) free(_buffer);
127 if ( data_size > (0xFFFF -
sizeof(element_header_t)) ) {
131 size_t cur_size = ntohl(_db->
size);
132 if ( (cur_size + data_size +
sizeof(element_header_t)) > _buffer_size ) {
138 if ( (cur_size + data_size +
sizeof(element_header_t)) > _buffer_size ) {
143 *_curhead = htons(data_size);
144 memcpy(_curdata, data, data_size);
146 _curhead = (element_header_t *)((
size_t)_curhead + data_size
147 +
sizeof(element_header_t));
148 _curdata = (
void *)((
size_t)_curdata + data_size +
sizeof(element_header_t));
149 _db->
size = htonl(cur_size +
sizeof(element_header_t) + data_size);
169 DynamicBuffer::increase()
171 size_t new_buffer_size;
173 if ( (_buffer_size) >= 0xFFFFFFFF / 2 ) {
174 if ( _buffer_size == 0xFFFFFFFF ) {
177 new_buffer_size = 0xFFFFFFFF;
180 new_buffer_size = _buffer_size * 2;
183 void *tmp = realloc(_buffer, new_buffer_size);
185 throw OutOfMemoryException();
187 _buffer_size = new_buffer_size;
188 _curhead = (element_header_t *)((
size_t)tmp + ((size_t)_curhead - (
size_t)_buffer));
189 _curdata = (
void *)((
size_t)tmp + ((
size_t)_curdata - (
size_t)_buffer));
203 return ntohl(_db->
size);
234 _it_curhead = _curhead;
235 _it_curdata = _curdata;
247 return (_read_only && (_it_curel < (ntohl(_db->
num_elements))));
265 if ( _it_curel > 0 ) {
266 size_t offset = ntohs(*_it_curhead) +
sizeof(element_header_t);
267 _it_curhead = (element_header_t *)((
size_t)_it_curhead + offset);
268 _it_curdata = (
void *)((
size_t)_it_curdata + offset);
271 *size = ntohs(*_it_curhead);