dynamic_buffer.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __NETCOMM_UTILS_DYNAMIC_BUFFER_H_
00026 #define __NETCOMM_UTILS_DYNAMIC_BUFFER_H_
00027
00028 #include <sys/types.h>
00029 #include <stdint.h>
00030
00031 namespace fawkes {
00032
00033 #pragma pack(push,4)
00034
00035
00036
00037
00038
00039 typedef struct {
00040 uint32_t size;
00041 uint32_t num_elements;
00042 } dynamic_list_t;
00043
00044 #pragma pack(pop)
00045
00046 class DynamicBuffer
00047 {
00048 public:
00049 DynamicBuffer(dynamic_list_t *db, size_t initial_buffer_size = 1024);
00050 DynamicBuffer(dynamic_list_t *db, void *buf, size_t size);
00051 virtual ~DynamicBuffer();
00052
00053 void append(const void *data, size_t data_size);
00054 void * buffer();
00055 size_t buffer_size();
00056 unsigned int num_elements();
00057
00058 size_t real_buffer_size();
00059
00060 bool has_next();
00061 void * next(size_t *size);
00062 void reset_iterator();
00063
00064 private:
00065
00066 typedef uint16_t element_header_t;
00067
00068 void increase();
00069
00070 bool _read_only;
00071
00072 dynamic_list_t *_db;
00073 void *_buffer;
00074 size_t _buffer_size;
00075 element_header_t *_curhead;
00076 void *_curdata;
00077
00078 uint16_t _it_curel;
00079 element_header_t *_it_curhead;
00080 void *_it_curdata;
00081
00082 };
00083
00084 }
00085
00086 #endif