Класс comm_buf_t предназначен для поддержки не ограниченных в размерах буферов двоичных данных, предназначеных для обмена данными (как между различными объектами в рамках одной программы, так и для межпрограммного или межмашинного взаимодействия).
Класс comm_buf_t предоставляет средства записи и чтения в/из буфер элементов простейших типов C++.
Данные, хранящиеся в буфере, преобразуются в BigEndian представление (старшее слово, младшее слово; старший байт, младший байт). При извлечении из буфера данные преобразуются в представление процессора (для x86 это LittleEndian).
Класс comm_buf_t, по аналогии с файлом, имеет понятие текущей позиции в буфере (pos). Каждая операция чтения/записи сдвигает позицию вправо (к концу буфера). Начальной позицией является нулевая позиция.
Емкостью буфера (capacity) называется емкость блока памяти, отведенного для хранения значения буфера. Когда емкость исчерпывается происходит автоматическое выделение нового блока памяти.
Размером данных (size) называется количество занятых байт в буфере. Размер данных автоматически увеличивается при записи данных в буфер. По аналогии с файлом текущая позиция в буфере не может превышать размер данных. Т.е. текущая позиция находится в диапазоне [0, size]. Изменение размера данных в буфере при записи осуществляется по формуле: size = max( pos + block_size, size ), где block_size - это размер помещаемых в буфер данных.
Открытые члены | |
comm_buf_t () | |
Конструктор по умолчанию. | |
comm_buf_t (size_t capacity) | |
Конструктор с явным заданием емкости. | |
comm_buf_t (const comm_buf_t &o) | |
Конструктор копирования. | |
comm_buf_t & | operator= (const comm_buf_t &o) |
Оператор копирования. | |
size_t | capacity () const |
Текущая емкость. | |
void | change_capacity (size_t new_capacity, bool save_contents=true) |
Изменение емкости буфера. | |
size_t | size () const |
Текущий размер данных. | |
void | change_size (size_t new_size) |
Установить новый размер данных. | |
size_t | pos () const |
Текущая позиция. | |
void | set_pos (size_t pos) |
Установить текущую позицию. | |
void | write (const char *v, size_t count) |
Запись данных. | |
void | write (const signed char *v, size_t count) |
Запись данных. | |
void | write (const unsigned char *v, size_t count) |
Запись данных. | |
void | write (const short *v, size_t count) |
Запись данных. | |
void | write (const unsigned short *v, size_t count) |
Запись данных. | |
void | write (const int *v, size_t count) |
Запись данных. | |
void | write (const unsigned int *v, size_t count) |
Запись данных. | |
void | write (const float *v, size_t count) |
Запись данных. | |
void | write (const double *v, size_t count) |
Запись данных. | |
virtual void | write (const std::string &p) |
void | read (char *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (signed char *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (unsigned char *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (short *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (unsigned short *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (int *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (unsigned int *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (float *v, size_t count) |
Чтение данных без проверки наличия данных. | |
void | read (double *v, size_t count) |
Чтение данных без проверки наличия данных. | |
virtual void | read (std::string &p) |
void | read_c_str (char *receiver, char terminator=0) |
Чтение данных без проверки наличия данных. | |
const void * | ptr () const |
Указатель на начала блока памяти, содержащего буфер. | |
const void * | current_ptr () const |
Указатель на текущую позицию. | |
void | subbuf (size_t from_pos, comm_buf_t &to, size_t to_pos, size_t count) const |
Выделение подбуфера. | |
void | subbuf (size_t from_pos, void *to, size_t count) const |
Выделение подбуфера. | |
void | insert (size_t to_pos, const comm_buf_t &from, size_t from_pos, size_t count) |
Вставка данных. | |
void | insert (size_t to_pos, const void *from, size_t count) |
Вставка данных. | |
void | erase (size_t from_offs, size_t count) |
Изъять данные из буфера. | |
void | swap (comm_buf_t &o) |
Обменять значения двух буферов. | |
Закрытые типы | |
typedef oess_1::io::mem_buf_t | base_type_t |
|
Конструктор с явным заданием емкости. Поведение при начальной емкости 0 байт не определено.
|
|
Конструктор копирования. Создается точная копия указанного объекта.
|
|
Изменение емкости буфера. Новый блок памяти выделяется всегда. Сохранение или не сохранение предыдущего значения буфера определяется значением параметра new_capacity. Новый размер = min( new_capacity, size ). Текущая позиция обнуляется.
|
|
Установить новый размер данных. Текущая позиция обнуляется. Операция выполняется только если new_size <= capacity(). |
|
Изъять данные из буфера. Изымается count байт начиная с позиции from_offs. Старое содержимое буфера "сжимается". Поведение при from_offs > size() или при (from_offs + count > size()) не определено. |
|
Вставка данных. Вставить count байт из from в позицию to_pos. Старое содержимое буфера "раздвигается". Текущая позиция обнуляется. Предполагается, что from указывает на блок памяти в котором храниться count байт. Поведение при to_pos > size() не определено. |
|
Вставка данных. Вставить count байт из from c позиции from_pos в позицию to_pos. Старое содержимое буфера "раздвигается". Текущая позиция обнуляется. Текущая позиция в буфере-источнике не изменяется. Наличие достаточного количества данных в from не проверяется. Поведение при to_pos > size() не определено.
|
|
Оператор копирования. Создается точная копия указанного объекта.
|
|
Чтение данных без проверки наличия данных. Осуществляет чтение последовательности байт, ограниченных указанным терминатором. Прочитанная последовательность завершается 0-символом. Если символ-терминатор не найден, то в приемник помещаются все данные от текущей позиции до конца данных в буфере. Сам символ-терминатор из буфера не извлекается.
|
|
Установить текущую позицию. Операция выполняется только если pos <= size(). |
|
Выделение подбуфера. По указателю to копируется count байт с позиции from_pos. Указатель to должен указывать на блок памяти достаточного размера, чтобы принять count байт. Позиция в буфере-источнике не изменяется. Наличие данных не контролируется.
|
|
Выделение подбуфера. В буфер to в позицию to_pos копируется count байт с позиции from_pos. Содержимое буфера-приемника с позиции to_pos не сохраняется (перезаписываются count байт в буфере-приемнике). Позиция в буфере-источнике не изменяется. Наличие данных не контролируется.
|
|
Обменять значения двух буферов. Происходит обмен только описателями буфером. Копирование данных между буферами не происходит. |