Класс so_4::rt::comm_buf_t

Полный список членов класса


Подробное описание

Коммуникационный буфер переменного размера.

Класс 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 - это размер помещаемых в буфер данных.

Заметки:
Данный класс является производным от oess_1::io::mem_buf_t. Сделано это для того, чтобы в comm_buf_t было легко осуществлять сериализацию средствами oess_1::stdsn. Все методы comm_buf_t просто обращаются к тем же самым методам oess_1::io::mem_buf_t. Сделано это для того, чтобы SObjectizer-приложения нужно было линковать только к so_4.x.x. Единственным уникальным методом comm_buf_t является метод read_c_str().
Примеры:

sample/raw_channel/tcp_cln.cpp.


Открытые члены

 comm_buf_t ()
 Конструктор по умолчанию.
 comm_buf_t (size_t capacity)
 Конструктор с явным заданием емкости.
 comm_buf_t (const comm_buf_t &o)
 Конструктор копирования.
comm_buf_toperator= (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  ) 

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  Количество копируемых байт.
Примеры:
sample/raw_channel/tcp_cln.cpp.

Используется в 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. Создано системой  doxygen1.5.6 Intervale SourceForge.net Logo