Класс 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 |
so_4::rt::comm_buf_t::comm_buf_t | ( | size_t | capacity | ) |
Конструктор с явным заданием емкости.
Поведение при начальной емкости 0 байт не определено.
capacity | Начальная емкость буфера в байтах. |
so_4::rt::comm_buf_t::comm_buf_t | ( | const comm_buf_t & | o | ) |
Конструктор копирования.
Создается точная копия указанного объекта.
o | Объект для копирования. |
comm_buf_t & so_4::rt::comm_buf_t::operator= | ( | const comm_buf_t & | o | ) |
Оператор копирования.
Создается точная копия указанного объекта.
void so_4::rt::comm_buf_t::change_capacity | ( | size_t | new_capacity, | |
bool | save_contents = true | |||
) |
Изменение емкости буфера.
Новый блок памяти выделяется всегда.
Сохранение или не сохранение предыдущего значения буфера определяется значением параметра new_capacity.
Новый размер = min( new_capacity, size ).
Текущая позиция обнуляется.
new_capacity | Новая емкость буфера. Поведение при new_capacity == 0 не определено. |
save_contents | Значение true предписывает скопировать старое содержимое буфера в новый блок (сколько поместиться). |
void so_4::rt::comm_buf_t::change_size | ( | size_t | new_size | ) |
Установить новый размер данных.
Текущая позиция обнуляется.
Операция выполняется только если new_size <= capacity().
void so_4::rt::comm_buf_t::set_pos | ( | size_t | pos | ) |
Установить текущую позицию.
Операция выполняется только если pos <= size().
Используется в so_4::rt::comm::impl::format_handshake_resp(), so_4::rt::comm::impl::handle_package(), so_4::rt::comm::zlib_transformator_t::in_transform(), so_4::rt::comm::impl::make_and_send_package(), so_4::rt::comm::impl::parse_sop_incoming_buffer(), so_4::rt::comm::sop_with_transformation_data_processor_t::process_incoming(), so_4::rt::comm::simple_sop_data_processor_t::process_incoming() и read_c_str().
void so_4::rt::comm_buf_t::read_c_str | ( | char * | receiver, | |
char | terminator = 0 | |||
) |
Чтение данных без проверки наличия данных.
Осуществляет чтение последовательности байт, ограниченных указанным терминатором. Прочитанная последовательность завершается 0-символом.
Если символ-терминатор не найден, то в приемник помещаются все данные от текущей позиции до конца данных в буфере.
Сам символ-терминатор из буфера не извлекается.
receiver | Буфер-приемник. Должен иметь достаточный размер для извлеченных данных и дополнительного 0-символа. |
terminator | Символ-терминатор. |
Перекрестные ссылки current_ptr(), pos(), set_pos() и size().
void so_4::rt::comm_buf_t::subbuf | ( | size_t | from_pos, | |
comm_buf_t & | to, | |||
size_t | to_pos, | |||
size_t | count | |||
) | const |
Выделение подбуфера.
В буфер to в позицию to_pos копируется count байт с позиции from_pos.
Содержимое буфера-приемника с позиции to_pos не сохраняется (перезаписываются count байт в буфере-приемнике).
Позиция в буфере-источнике не изменяется.
Наличие данных не контролируется.
from_pos | Откуда начинать брать данные. |
to | Буфер-приемник. |
to_pos | В какую позицию в буфер приемник начинать запись. |
count | Количество копируемых байт. |
void so_4::rt::comm_buf_t::subbuf | ( | size_t | from_pos, | |
void * | to, | |||
size_t | count | |||
) | const |
Выделение подбуфера.
По указателю to копируется count байт с позиции from_pos.
Указатель to должен указывать на блок памяти достаточного размера, чтобы принять count байт.
Позиция в буфере-источнике не изменяется.
Наличие данных не контролируется.
from_pos | Откуда начинать брать данные. |
to | Указатель на блок памяти для приема данных. |
count | Количество копируемых байт. |
void so_4::rt::comm_buf_t::insert | ( | size_t | to_pos, | |
const comm_buf_t & | from, | |||
size_t | from_pos, | |||
size_t | count | |||
) |
Вставка данных.
Вставить count байт из from c позиции from_pos в позицию to_pos. Старое содержимое буфера "раздвигается".
Текущая позиция обнуляется.
Текущая позиция в буфере-источнике не изменяется.
Наличие достаточного количества данных в from не проверяется.
Поведение при to_pos > size() не определено.
to_pos | Позиция, куда будут вставляться данные. |
from | Буфер-источник данных. |
from_pos | Позиция в буфере-источнике, откуда нужно брать данные. |
count | Количество копируемых байт. |
Используется в so_4::rt::comm::zlib_transformator_t::in_transform() и so_4::rt::comm::simple_sop_data_processor_t::process_incoming().
void so_4::rt::comm_buf_t::insert | ( | size_t | to_pos, | |
const void * | from, | |||
size_t | count | |||
) |
Вставка данных.
Вставить count байт из from в позицию to_pos. Старое содержимое буфера "раздвигается".
Текущая позиция обнуляется.
Предполагается, что from указывает на блок памяти в котором храниться count байт.
Поведение при to_pos > size() не определено.
void so_4::rt::comm_buf_t::erase | ( | size_t | from_offs, | |
size_t | count | |||
) |
Изъять данные из буфера.
Изымается count байт начиная с позиции from_offs. Старое содержимое буфера "сжимается".
Поведение при from_offs > size() или при (from_offs + count > size()) не определено.
Используется в so_4::rt::comm::zlib_transformator_t::in_transform() и so_4::rt::comm::impl::parse_sop_incoming_buffer().
void so_4::rt::comm_buf_t::swap | ( | comm_buf_t & | o | ) |
Обменять значения двух буферов.
Происходит обмен только описателями буфером. Копирование данных между буферами не происходит.
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:49 2008. Создано системой 1.5.6 |