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);
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);
DynamicBuffer(dynamic_list_t *db, size_t initial_buffer_size=1024)
Write constructor.
unsigned int num_elements()
Get number of elements.
uint32_t size
total size of list buffer
uint32_t num_elements
number of elements in list
Fawkes library namespace.
void * buffer()
Get pointer to buffer.
bool has_next()
Check if another element is available.
size_t buffer_size()
Get buffer size.
virtual ~DynamicBuffer()
Destructor.
size_t real_buffer_size()
Get real buffer size.
void reset_iterator()
Reset iterator.
void append(const void *data, size_t data_size)
Append data.
Expected parameter is missing.
System ran out of memory and desired operation could not be fulfilled.
void * next(size_t *size)
Get next buffer.