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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Богомол-НИК
Сообщения: 1
Зарегистрирован: 19 авг 2014, 18:59

Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:

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

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.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

На практике, приложению нужны результаты уже сразу после Delete/Insert, чтобы, например, проанализировать участок данных и сформировать дальнейшую цепочку действий. Например, при парсинге текста последовательность будет иметь вид:
Delete...
GetData...
....
Delete...
GetData...
....
Никакой оптимизации здесь, очевидно, не получится. Только наоборот - чрезмерное усложнение.
Я бы посоветовал для начала создать реализацию какого нибудь алгоритма используя методы класса, а уж потом, сформировав цепочку вызовов - увидеть картину целиком и сделать некоторые выводы. Возможно появится новый метод класса, который ускорит работу именно того алгоритма.
В общем, нужен предварительный анализ данных.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Поддреживаю somewhere. В реальных условиях после каждой операции над данными, приложению сразу же будут нужны все измененные данные. Хотя бы для того, чтобы отобразить их на экране. Достаточно сложно представить себе текстовый редактор, в котором пользователь кнопит текст, удаляет, вставляет, снова кнопит, и всё это вслепую, а потом нажимает кнопку "Обновить", чтобы увидеть результаты своей работы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить