Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > C/C++ > C/C++
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.09.2014, 22:26
Альмир
 
Сообщения: n/a
По умолчанию Класс редактирования данных. Нужны советы по реализации

Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:
Код:
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.
Ответить с цитированием
  #2  
Старый 16.09.2014, 02:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,868
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, можно и просто хранить список запросов, а потом их выполнять в момент запроса результата. Только вот не вижу тут выигрыша особого. Все-равно придется все операции сделать. Ну и проблемы могут быть с Insert. Т.е. ты записал операцию, сохранил там указатель на переданные данные, а потом вызывающий код эти данные удалил... или надо сначала их скопировать куда-то к себе. Тогда получается двойное копирование для этой операции. Сплошной проигрыш.
Выигрыш только тогда, когда ты можешь какие-то операции схлопнуть. Но это очень не тривиальная задача.

Но если очень хочется,то создай специальный класс, например
Код:
CMemOp
{
  int op;
  int ops;
  int len;
  void * data;
}
который будешь склвдывать в список (хочешь сделай себе массив, хочешь - воспользуйся чем-нить из STL). Потом просто будешь "проигрывать" этот список.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter   Ссылка на Telegram