Работа с буфером потока

Кластер

Кластер - это непрерывный участок памяти (последовательность байтов), который описывается классом Cluster в файле io_buffer.h.

Класс содержит начало кластера (для дисковых кластеров - смещение, для памяти - адрес) и длину кластера в байтах.

Класс реализует методы доступа к данным кластера:

  • uint16 _len() - Получить длину кластера.

  • size_t _off() - Получить начало кластера.

  • const uint8 * _ptr() - Выдать адрес.

  • uint8 * _getMemPointer() - Выдать адрес.

  • void clear() - Очистить кластер.

  • void AllocFile( size_t beg, uint16 len ) - Запомнить смещение в файле и кол-во байт.

  • void SetClusterOffset( size_t off ) - Установить начало кластера.

  • void SetClusterLength( uint16 len ) - Установить длину кластера.

  • static size_t SizeOf( VERSION version ) - Размер данных о кластере в потоке указанной версии.

Файловое пространство

Файловое пространство - это набор кластеров. Файловое пространство описывается классом FileSpace в файле io_buffer.h.

Класс содержит массив индексов кластеров и количество занятых байтов в последнем кластере.

Класс реализует методы доступа к массиву индексов кластеров:

  • size_t Count() - Получить количество элементов в массиве.

  • void Flush() - Обнулить количество элементов в массиве.

  • void RemoveInd( size_t ) - Удалить элемент из массива.

  • size_t * Add() - Добавить элемент в конец массива.

  • size_t * Add( const size_t & ) - Добавить элемент в конец массива.

  • void SetSize( size_t, bool ) - Установить новый размер массива.

  • void Reserve( size_t ) - Зарезервировать место под столько элементов.

  • bool IsExist( size_t & ) - Выдать true, если элемент найден.

  • size_t FindIt( size_t & el ) - Найти индекс элемента (если не найден вернуть -1).

  • size_t * InsertInd( size_t index, const size_t & el ) - Вставить пустой элемент перед указанным.

  • const size_t * GetAddr() - Выдать адрес начала массива.

  • size_t * AddItems( size_t n ) - Добавить n элементов в конец массива.

  • size_t & operator []( size_t loc ) - Оператор доступа к элементу массива по индексу.

  • uint16 & rest() - Получить количество занятых байт в последнем кластере.

Позиция чтения/записи

Класс ClusterReference описывает позицию в кластере для чтения/записи. Он определен в файле io_buffer.h.

Класс содержит индекс кластера в массиве кластеров буфера iobuf_Seq и смещение в данном кластере.

Потоковый последовательный буфер

Класс iobuf_Seq описывает потоковый буфер, который обеспечивает только последовательную запись/чтение (базовый класс). Класс iobuf_Seq и его наследники служат для выполнения операций чтения и записи в интересах потока (класс tape). Объявлен в файле io_buffer.h.

Используются следующие термины:

  • Хранилище - файл на диске или область памяти.

  • Файл — файловое пространство внутри хранилища.

Основные данные класса:

  • FileSpace sys - «системное» файловое пространство. Открывается в конструкторе класса tape.

  • PArray<FileSpace> files - список файловых пространств, содержащихся в iobuf_Seq. Первым элементом в нем всегда лежит адрес sys.

  • uint32 stateFlag - состояние буфера.

  • VERSION storageVers - версия хранилища.

  • VERSION curFileVers - версия текущего открытого файлового пространства (потока). В общем случае версия хранилища и версия любого файлового пространства в нем могут не совпадать.

  • uint8 bufferMode - Режим, в котором может работать буфер.

  • uint8 curFileMode - Режим открытия текущего файлового пространства. В общем случае режим хранилища и режим открытого файлового пространства в нем могут не совпадать. Ограничение - если режим буфера io::in, то попытка открыть файловое пространство на запись (io::out) не приводит к открытию.

  • uint8 * base - Указатель на начало буфера в памяти.

  • uint8 * ptr - Указатель на след символ в памяти.

  • uint8 * end - Указатель на конец буфера в памяти.

Основные методы класса:

  • Доступ к массиву кластеров:

    • void Reserve( size_t n, bool addAdditionalSpace ) - Зарезервировать место под заданное количество элементов.

    • void Flush() - Обнулить количество элементов.

    • void HardFlush() - Освободить всю память.

    • void Adjust() - Удалить лишнюю память.

    • Cluster * Add() - Добавить элемент в конец массива.

    • Cluster * Add( const Cluster & ) - Добавить данный элемент в конец массива.

    • size_t Count() - Выдать количество элементов массива.

    • Cluster & operator []( size_t ) - Оператор доступа по индексу.

  • Доступ к файловым пространствам:

    • void ReserveFiles( size_t n, bool addAdditionalSpace ) - Зарезервировать место под заданное количество файловых пространств.

    • ClusterReference getCurrentClusterPos() - Получить текущую позицию в буфере.

    • FileSpace & sysFile() - Получить доступ к системному файловому пространству.

    • FileSpace * openedFile() - Получить доступ к открытому файловому пространству.

  • Доступ к версиям:

    • void SetVersionsByStorage() - Установить текущую версию равной версии хранилища.

    • VERSION MathVersion() - вернуть главную версию (математического ядра).

    • VERSION AppVersion( size_t ) - Вернуть дополнительную версию (версию конечного приложения).

    • const VersionContainer & GetVersionsContainer() - Получить версии буфера.

    • VERSION GetStorageVersion() - Узнать версию хранилища.

    • VERSION GetFormatVersion() - Узнать версию формата.

    • void SetFormatVersion( VERSION ) - Установить версию формата.

Потоковый буфер с произвольным доступом

Класс iobuf реализует потоковый буфер с произвольным доступом. Он наследует от класса iobuf_Seq и расширяет его функциональность возможностью удаления и перезаписи файловых пространств (базовый класс). Объявлен в файле io_buffer.h.

Класс содержит файловое пространство со списком освобожденных кластеров. При удалении файла все его кластеры переносятся сюда. При записи, когда необходимо распределить новый кластер, сначала проверяется этот массив на наличие свободных кластеров. Кластеры в файловом пространстве всегда лежат упорядоченными по смещению от начала файла.

Методы класса:

  • bool open( FileSpace &, uint8, const VersionContainer &, bool fullCheck = true ) - Открыть файловое пространство, если оно свое. Флаг fullCheck = false отключает избыточные проверки (ради производительности).

  • bool del( FileSpace & ) - Освободить место, занимаемое файловым пространством.

  • bool truncate( FileSpace &, size_t ) - Урезать файловое пространство.

  • bool detach( FileSpace & ) - Отсоединить файловое пространство от буфера.

  • bool speedOnClose() - Нужно ли упорядочивать при закрытии.

  • void speedOnClose( bool ) - Установить флаг необходимости упорядочивания при закрытии.

  • void free( size_t ) - Освободить кластер.

Потоковый буфер в памяти

Класс membuf реализует потоковый буфер памяти. Наследует от iobuf. Объявлен в файле io_memory_buffer.h.

Потоковый буфер памяти предназначен для использования в потоках чтения и записи. Кроме необходимых для буфера свойств, имеет функции для упаковки в непрерывный блок памяти, что позволяет передавать данные буфера через память в другое приложение.

Класс содержит массив файловых пространств, который хранит все используемые файловые пространства, кроме sys, который определен в iobuf_Seq. При использовании расширенного формата объекты каждого уровня записываются в отдельное файловое пространство. При этом индекс файлового пространства в векторе соответствует уровню объекта в модели.

Основные методы класса:

  • bool isEmpty() - Пуст ли буфер.

  • size_t toMemory( const char *& memory, size_t addSize = 0 ) - Записать в непрерывную память. Если memory != 0 (память уже распределена), то addSize равен ее размеру, если memory = 0, то addSize определяет, сколько байтов добавить в начале, обнулив их.

  • bool fromMemory( const char * ) - Прочитать из непрерывной памяти.

  • size_t getMemLen() - Вычислить необходимую длину непрерывного куска памяти для буфера.

  • void clean() - Очистить буфер.

  • void closeBuff() - Закрыть буфер.

Чтение и запись буфера памяти в файле на диске

Функции записи непрерывного буфера памяти в файл на диске и чтения в непрерывный буфер памяти из файла на диске определены в io_memory_buffer.h.

Чтение непрерывного буфера памяти из файла на диске:

  • iobuf & createiobuf( const TCHAR * fileName ).

Запись непрерывного буфера памяти в файл на диске:

  • bool writeiobuftodisk( const TCHAR * fileName, membuf & buf ).