Страница 1 из 1

Класс редактирования данных. Нужны советы по реализации

Добавлено: 15 сен 2014, 22:27
Богомол-НИК
Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:

Код: Выделить всё

void Change(unsigned long StartByte, const void *NewData, unsigned long DataSize);
void Delete(unsigned long StartByte, unsigned long Size);
void Insert(unsigned long StartByte, const void *Data, unsigned long DataSize);
Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его.

Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов:

Код: Выделить всё

Insert(5, MyData, 10); // Вставляем между 4-ым и 5-ым байтами 10 байтов MyData.
Delete(7, 2); * * * * *// Удаляем 7-ой и 8-ой байты.
Delete(4, 10); * * * * // Удаляем с 4-го по 13-ый байты.
На деле, такая запись аналогична записи:

Код: Выделить всё

Delete(4, 2);
Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта:

Код: Выделить всё

unsigned long GetData(void *Buffer, unsigned long BufferSize);
Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями.

Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI.

Re: Класс редактирования данных. Нужны советы по реализации

Добавлено: 16 сен 2014, 09:48
somewhere
На практике, приложению нужны результаты уже сразу после Delete/Insert, чтобы, например, проанализировать участок данных и сформировать дальнейшую цепочку действий. Например, при парсинге текста последовательность будет иметь вид:
Delete...
GetData...
....
Delete...
GetData...
....
Никакой оптимизации здесь, очевидно, не получится. Только наоборот - чрезмерное усложнение.
Я бы посоветовал для начала создать реализацию какого нибудь алгоритма используя методы класса, а уж потом, сформировав цепочку вызовов - увидеть картину целиком и сделать некоторые выводы. Возможно появится новый метод класса, который ускорит работу именно того алгоритма.
В общем, нужен предварительный анализ данных.

Re: Класс редактирования данных. Нужны советы по реализации

Добавлено: 16 сен 2014, 11:09
Romeo
Поддреживаю somewhere. В реальных условиях после каждой операции над данными, приложению сразу же будут нужны все измененные данные. Хотя бы для того, чтобы отобразить их на экране. Достаточно сложно представить себе текстовый редактор, в котором пользователь кнопит текст, удаляет, вставляет, снова кнопит, и всё это вслепую, а потом нажимает кнопку "Обновить", чтобы увидеть результаты своей работы.