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

Тема в разделе "Общие вопросы по С и С++", создана пользователем 1CRANK1, 15 сен 2014.

  1. 1CRANK1

    1CRANK1 New Member

    Регистрация:
    18 авг 2014
    Сообщения:
    2
    Симпатии:
    0
    Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:<!--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.
     
  2. ivashovLEX

    ivashovLEX New Member

    Регистрация:
    5 авг 2014
    Сообщения:
    4
    Симпатии:
    0
    Вам будет очень сложно обогнать функции стандартной библиотеки выполняющие те же задачи. Да и зачем.
     
  3. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Годная задача если данные имеют большой размер.
    0Menistrel0 , функции стандартной библиотеки ничего такого не делают.

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

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

    1CRANK1 New Member

    Регистрация:
    18 авг 2014
    Сообщения:
    2
    Симпатии:
    0
    Если обогнать можно, то ответ на вопрос "зачем?" очевиден. Если нельзя, тогда незачем.
     
Загрузка...
Похожие Темы - Класс Редактирования Данных
  1. swyatogor
    Ответов:
    0
    Просмотров:
    65
  2. Corexis
    Ответов:
    0
    Просмотров:
    73
  3. rrrFer
    Ответов:
    0
    Просмотров:
    131
  4. Sander
    Ответов:
    1
    Просмотров:
    510
  5. Искушенный
    Ответов:
    0
    Просмотров:
    432

Поделиться этой страницей