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

  • Автор темы 1CRANK1
  • Дата начала
1

1CRANK1

#1
Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:<!--shcode--><pre><code class='CODE'>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);[/CODE]Казалось бы, все просто: выделяй память, заменяй, удаляй, добавляй... Однако в процессе редактирования данных промежуточные итоги мне не нужны - требуется только конечный результат. Поэтому возникла мысль не изменять данные при каждом вызове методов, а только лишь сохранять информацию об изменениях. А когда будет запрошен результат, тогда уж и формировать его.

Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов:<!--shcode--><pre><code class='CODE'>Insert(5, MyData, 10); // Вставляем между 4-ым и 5-ым байтами 10 байтов MyData.
Delete(7, 2);          // Удаляем 7-ой и 8-ой байты.
Delete(4, 10);         // Удаляем с 4-го по 13-ый байты.[/CODE]На деле, такая запись аналогична записи:<!--shcode--><pre><code class='CODE'>Delete(4, 2);[/CODE]Поэтому реальное изменение данных "на лету" не оптимально, если учесть, что промежуточный результат (как я уже писал) мне не интересен. "Компоновкой" получившегося должен заниматься отдельный метод, возвращающий результат всей работы объекта:<!--shcode--><pre><code class='CODE'>unsigned long GetData(void *Buffer, unsigned long BufferSize);[/CODE]Осталось только придумать, как хранить и обрабатывать информацию о поступивших изменениях. Вот с этим-то у меня и затык. Ничего, что очевидно выигрывает у memcpy() и memmove() по скорости и ресурсам, в голову не приходит. Поделитесь своими мыслями.

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

ivashovLEX

#2
Вам будет очень сложно обогнать функции стандартной библиотеки выполняющие те же задачи. Да и зачем.
 
R

rrrFer

#3
Годная задача если данные имеют большой размер.
0Menistrel0 , функции стандартной библиотеки ничего такого не делают.

Я видел что-то такое в библиотеке libvips для работы с изображениями, но там были преимущества подхода из за того, что изображения очень большие - библиотека юзается например для при обработке снимком из космоса, ну или википедия пользуется ей при обработке снимков всяких картин в бешенном разрешении.

У вас объемы данных также велики?
 
1

1CRANK1

#4
Если обогнать можно, то ответ на вопрос "зачем?" очевиден. Если нельзя, тогда незачем.