#include <subbinstream.hpp>
Граф наследования:isubbinstream_t:
Реализация интерфейса obinstream_t для чтения из некоторого потока не более указаного количества байт.
При извлечении их входного потока составных TLV (oess_1::tlv::compound_tlv_t) возникает задача прочитать из уже существующего потока не более Length байт. При этом операции чтения могут выполняться несколькими объектами (дочерними TLV) и определить сколько именно было прочитано каждым из объектов может быть невозможно. Можно было бы создать промежуточный буфер и записать в него Length байт из входного потока, а затем осуществлять чтение объектов из этого буфера. Но это требует дополнительных расходов памяти.
Класс isubbinstream_t предназначен для решения подобных задач. Он перенаправляет все операции чтения в исходный поток. Но при этом контролируется, сколько байт было прочитано. Считается, что подпоток исчерпывается после того, как из исходного потока будет прочитано Length байт.
Если с помощью класса isubbinstream_t из исходного потока было извлечено менее Length байт, то класс isubbinstream_t не пытается изъять из исходного потока невыбранные байты.
Открытые члены | |
isubbinstream_t (ibinstream_t &source, size_t capacity) | |
size_t | capacity () const |
Емкость подпотока. | |
virtual size_t | size () const |
Объем находящихся в потоке данных. | |
virtual size_t | pos () const |
Количество прочитанных из подпотока байт. | |
virtual bool | eof () const |
Возвращает true, если pos() == capacity(). | |
Защищенные члены | |
virtual const oess_1::char_t * | in_reserve (size_t item_count, size_t item_size, size_t &item_available) |
Реализация метода из базового класса. | |
virtual void | in_shift (size_t item_count, size_t item_size) |
Реализация метода из базового класса. | |
Закрытые члены | |
isubbinstream_t (const isubbinstream_t &) | |
Защита от копирования. | |
isubbinstream_t & | operator= (const isubbinstream_t &) |
Защита от копирования. | |
Закрытые данные | |
ibinstream_t & | m_source |
Исходный поток. | |
size_t | m_capacity |
Максимальный объем подпотока. | |
size_t | m_pos |
Количество прочитанных из подпотока байт. |
isubbinstream_t | ( | ibinstream_t & | source, | |
size_t | capacity | |||
) |
source | Исходный входной поток. |
capacity | Максимальная емкость подпотока. |
size_t capacity | ( | ) | const |
Емкость подпотока.
const oess_1::char_t * in_reserve | ( | size_t | item_count, | |
size_t | item_size, | |||
size_t & | item_available | |||
) | [protected, virtual] |
Реализация метода из базового класса.
Если нет достаточного объема данных для чтения хотя бы одного элемента, то порождается исключение.
item_count | Количество элементов, которые нужно прочитать. |
item_size | Размер одного элемента в байтах. |
item_available | Количество элементов, доступных по возвращенному указателю. |
Замещает ibinbuffer_t.
void in_shift | ( | size_t | item_count, | |
size_t | item_size | |||
) | [protected, virtual] |
Реализация метода из базового класса.
item_count | Количество успешно прочитанных элементов. |
item_size | Размер одного элемента в байтах. |
Замещает ibinbuffer_t.
size_t size | ( | ) | const [virtual] |
Объем находящихся в потоке данных.
Замещает ibinbuffer_t.
size_t m_capacity [private] |
Максимальный объем подпотока.
Задается в конструкторе.