Я пытаюсь написать библиотеку C++ 11 как часть более широкого проекта, реализующего стек изменений (модификация, вставка и удаление), реализованный поверх оригинала буфер. Затем цель состоит в том, чтобы иметь возможность быстро просматривать «изменения» и получать измененные данные.Используется эффективный поиск буфера со стеком модификаций данных
Мой текущий подход:
- Поддерживать упорядоченный список изменений, упорядоченных по смещению начала изменения
- поддерживать также стек одних и тех же изменений, так что они могут быть свернуты в заказать
- Новые изменения в стек и вставляется в список в нужном месте
- могут быть изменены изменения-по-смещения списка, если изменение взаимодействует с другими
- Например, модификация байтов 5-10 отменяет начало более ранней модификации от 8-12
- Кроме того, изменения вставки или удаления изменят кажущееся смещение данных, происходящих после них (удаление байтов 5-10 означает что то, что раньше было байтом 20, теперь найдено в 15)
- Чтобы найти измененные данные, вы можете просмотреть список применяемых изменений (и смещение в пределах этого изменения - другое изменение может иметь недействительными некоторые из них) или найти правильное смещение в исходных данных, если изменения не коснулись этого смещения
- Цель состоит в том, чтобы быстро выполнить поиск - добавление изменений может потребовать некоторых усилий, чтобы запутаться со списком, но позже просмотры, которые значительно превысят изменения, в упорядоченном списке должны быть довольно простыми.
- Кроме того, вы не должны постоянно копировать данные - данные каждого изменения в хранится вместе с ним, а исходные данные нетронутым
- Undo затем реализуется выскакивают последнее изменение из стека и отбрасывания любой изменения, внесенные в него добавлением этого изменения.
Это, кажется, довольно сложная задача - есть много вещей, о которых нужно позаботиться, и я быстро накапливаю сложный код!
Я уверен, что это должно быть проблемой, которая была рассмотрена в другом программном обеспечении, но оглядываясь на различные шестнадцатеричные редакторы и т. Д., Не указала мне на полезную реализацию. Есть ли название для этой проблемы («data undo stack» и друзья не получили меня очень далеко!) Или библиотеку, которая может использоваться, даже как ссылка, для такого рода вещей?
Это заставляет меня думать о https://en.wikibooks.org/wiki/Understanding_Darcs/Patch_theory. darcs - это система управления распределенной версией, например git, но основанная на отслеживании коллекций патчей, а не отслеживание снимков деревьев (например, git). Возможно, вам захочется осмотреть исходный код darcs для алгоритмов, чтобы эффективно получать данные при данной ревизии. Тем не менее, я думаю, что вы получите гораздо лучшие результаты от непосредственного сохранения «текущего состояния» и инверсии вещей в информацию об отмене, как это предлагает 500-й ответ. –