25 #include <core/exceptions/software.h> 26 #include <core/exceptions/system.h> 27 #include <netcomm/utils/dynamic_buffer.h> 28 #include <netinet/in.h> 67 _buffer_size = initial_buffer_size;
68 _buffer = malloc(_buffer_size);
69 _curhead = (element_header_t *)_buffer;
70 _curdata = (
void *)((
size_t)_buffer +
sizeof(element_header_t));
93 _curhead = (element_header_t *)_buffer;
94 _curdata = (
void *)((
size_t)_buffer +
sizeof(element_header_t));
96 _it_curhead = _curhead;
97 _it_curdata = _curdata;
125 if (data_size > (0xFFFF -
sizeof(element_header_t))) {
129 size_t cur_size = ntohl(_db->
size);
130 if ((cur_size + data_size +
sizeof(element_header_t)) > _buffer_size) {
136 if ((cur_size + data_size +
sizeof(element_header_t)) > _buffer_size) {
141 *_curhead = htons(data_size);
142 memcpy(_curdata, data, data_size);
144 _curhead = (element_header_t *)((
size_t)_curhead + data_size +
sizeof(element_header_t));
145 _curdata = (
void *)((
size_t)_curdata + data_size +
sizeof(element_header_t));
146 _db->
size = htonl(cur_size +
sizeof(element_header_t) + data_size);
164 DynamicBuffer::increase()
166 size_t new_buffer_size;
168 if ((_buffer_size) >= 0xFFFFFFFF / 2) {
169 if (_buffer_size == 0xFFFFFFFF) {
172 new_buffer_size = 0xFFFFFFFF;
175 new_buffer_size = _buffer_size * 2;
178 void *tmp = realloc(_buffer, new_buffer_size);
180 throw OutOfMemoryException();
182 _buffer_size = new_buffer_size;
183 _curhead = (element_header_t *)((
size_t)tmp + ((size_t)_curhead - (
size_t)_buffer));
184 _curdata = (
void *)((
size_t)tmp + ((size_t)_curdata - (
size_t)_buffer));
197 return ntohl(_db->
size);
225 _it_curhead = _curhead;
226 _it_curdata = _curdata;
237 return (_read_only && (_it_curel < (ntohl(_db->
num_elements))));
255 size_t offset = ntohs(*_it_curhead) +
sizeof(element_header_t);
256 _it_curhead = (element_header_t *)((
size_t)_it_curhead + offset);
257 _it_curdata = (
void *)((
size_t)_it_curdata + offset);
260 *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.