Предыстория
Был я, были мои отношачи с embedded, было отсутствие идеального клона vi (честно говоря, не сильно и искал). И я решил начать проект iv. Идея: инимальный легкий редактор на C++, поддерживающий ощутимое подмножество функционала vim. За исключением языка, не являющегося C, ориентируюсь на философию suckless.org.
Речь в данной серии постов будет идти о выборе underlying data structures для iv.
Не претендую на научную ценность, главная цель — экспрессия на Интернеты кучи мыслей о проекте.
Что делать?
Нулевой вариант будет, конечно, std::list<char> — есть вероятность что я таки остановлюсь именно на нем.
В самом начале проекта идея была замутить^Wреализовать магическую (функциональную десу) структуру данных:
- Персистентную (обеспечивающую сосуществование всех когда-либо пройденных состояний).
- С автопросчитываемыми динамическими характеристиками подмножеств, ну на самом деле просто количества 'n' в каждом поддереве, а реализовать на AVL, с первого взгляда ничего сложного в персистент АВЛ дереве нет, но это только с первого взгляда.
Что привело меня к необходимости как-то зафиксировать желаемый функционал редактора. Конечно хотелось бы сделать все адски оптимально, чтобы было ништячно на разном эмбеддеде, но скажем переход на нужную строку можно и простым итерированием сделать.
В первых коммитах использовался контейнер с std::string-s. Это неудобно, надо оперировать текстом как контейнером именно символов.
// А теперь идем и таки читаем про skip list
// Прочитал, но кажется в данном случае идея вряд ли пригодится. Хотя сам по себе рандом в логике штука определенно позитивная
И выход есть! Пойдем по пути концептуально-литературного дизайна в роли архитектуры! Вот вам и Art of Programming^^ Десу~
Starting using hints from the subconscious
Как уважаемая публика, вероятно, знает — I.V. stands for intra-venous.
А ведь если задуматься, между процессом внутривенной инъекции и логикой текстового редактора есть определенное сходство! Представим, что допустим мне допустим нужно допустим ширнуться допустим метпервътином.
В главных ролях:
— Игла / струна (string!)
— Баян (syringe, focus substance container)
— Вена (голубой экран ПК)
Если у тебя, читатель, та же форма аутизма что и у меня, то ты уже понял, что мы будем набирать в спецбуфер символы файла посланные нам Шивой путем их удачного нахождения где-то рядом, и инжектить их out в View максимально быстро вместе с красивой подсветкой :)
Если у тебя хорошая интуиция, то ты уже просек, что речь пойдет о контроллере. Model должна быть желательно любая, хоть действительно std::list<char>, View тривиально следует из man ncurses, а вот без контроля дело не пойдет ;)
Actually doing some design
В модели присутствуют итератор на курсор и на первый символ вьюпорта.
Также итераторы на marks и compile errors.
Первая вещь, от которой неплохо было бы абстрагироваться — это lifetime итераторов которая непредсказуема если мы юзаем persistent balanced tree (PBT), что может когда-нибудь оказаться действительно оправданным (когда у меня руки выпрямятся).
Автор: Железный человек