UniSet
1.4.0
|
Классы | |
class | CycleStorageIterator |
Открытые типы | |
typedef CycleStorageIterator | iterator |
Открытые члены | |
CycleStorage () | |
CycleStorage (const char *name, int byte_sz, int inf_sz, int inf_count, int seek, bool create=false) | |
bool | open (const char *name, int byte_sz, int inf_sz, int inf_count, int seek) |
bool | create (const char *name, int byte_sz, int inf_sz, int inf_count, int seek) |
bool | isOpen () |
bool | addRow (void *str) |
bool | delRow (int row) |
bool | delAllRows (void) |
void * | readRow (int num, void *str) |
int | getIter (void) |
bool | setSize (int count) |
int | getByteSize () |
int | getSize () |
int | getInfSize () |
int | getFullSize () |
bool | checkAttr (int inf_sz, int inf_count, int seek) |
int | getHead () |
int | getTail () |
iterator | begin () |
iterator | end () |
Защищенные данные | |
FILE * | file |
int | inf_size |
int | head |
int | tail |
Конструктор по умолчанию не открывает и не создает нового журнала
Функции класса CycleStorage, циклически переписываемого журнала, перезаписываются самые старые элемениты при полном заполнении журнала
CycleStorage::CycleStorage | ( | const char * | name, |
int | byte_sz, | ||
int | inf_sz, | ||
int | inf_count, | ||
int | seek, | ||
bool | create = false |
||
) |
bool CycleStorage::addRow | ( | void * | str | ) |
Добавление информации в конец журнала
Первые 2 случая - список пуст (head=-1), в списке 1 элемент(head=tail=0) рассматриваю отдельно)
Статус элемента совпадает со статусом последнего элемента в журнале 2, 3 -> 2; 4, 5 -> 4
Если последний элемент журнала в крайней правой позиции выделенной части файла, переходим в начало части файла и инвертируем статус 2->4, 4->2
Переписываем головной элемент новым, а второй от начала делаем головным, т. е. сдвигаем голову на 1 элемент вперед
bool CycleStorage::checkAttr | ( | int | inf_sz, |
int | inf_count, | ||
int | seek | ||
) |
Использовать для проверки совпадения заголовков
Читаем заголовок
Проверяем заголовок на совпадение с нашими значениями
Используется в open().
bool CycleStorage::create | ( | const char * | name, |
int | byte_sz, | ||
int | inf_sz, | ||
int | inf_count, | ||
int | seek | ||
) |
Создаем файл, если его нет
Записываем заголовок журнала
Создаем журнал нужного размера
Используется в CycleStorage().
bool CycleStorage::delAllRows | ( | void | ) |
Очистка журнала
Переписываем статусы всех элементов нулями
bool CycleStorage::delRow | ( | int | row | ) |
Удаление информации с номером ряда row
При удалении меняем стутус 1->6, 2->3, 4->5 или возвращаем false
int CycleStorage::getIter | ( | void | ) |
Получение кол-ва итерации при поиске начала/конца журнала (для тестовой программы)
bool CycleStorage::open | ( | const char * | name, |
int | byte_sz, | ||
int | inf_sz, | ||
int | inf_count, | ||
int | seek | ||
) |
inf_sz | - размер поля информации, |
inf_count | - количество записей (размером inf_sz +1 на ключевое поле) |
seek | - отступ от начала файла (указывает место, где расположен журнал) |
размер всего журнала будет равен inf_count*(inf_sz+1) + sizeof(CycleStorageAttr), где последнее слагаемое - размер заголовка размер можно получить, вызвав функцию getByteSize()
Если уже был открыт файл в переменной данного класса, он закрывается и открывается новый
Перекрестные ссылки checkAttr().
Используется в CycleStorage().
void * CycleStorage::readRow | ( | int | num, |
void * | str | ||
) |
TODO: можно убрать из параметров str, просто возвращать значение
Отсчитываем номер элемента от головы журнала
Используется в CycleStorage::CycleStorageIterator::operator++().
bool CycleStorage::setSize | ( | int | count | ) |
Изменение размера журнала (количества записей в нем)
Функция для изменения размера журнала. Удаляет все записи, если новый размер меньше. Заполняет новое место записями, аналогичными удаленным, если новый размер больше. Вызывать лучше не часто, т. к. переписывается заголовок журнала, расположенный статически в одном месте
Записываем заголовок журнала