Как создать дерево? (замена KeyValues)

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Привет,
у кого-нибудь есть готовый код для хранения в памяти/доступа к многоуровневому дереву строк?

Я хочу создать замену классу KeyValues, который у Valve багнутый и съедает некоторые символы Unicode и имеет проблемы с регистром. Пример:
PHP:
    char str[] = "临死一搏暴雨版/Lighthouse Storm Mode";
    PrintToServer("Original: %s", str);
    KeyValues kv = new KeyValues("root");
    kv.Rewind();
    if (kv.JumpToKey(str, true))
    {
        char buf[128];
        kv.GetSectionName(buf, sizeof(buf));
        PrintToServer("Current key: '%s'", buf);
    }
Original: 临死一搏暴雨版/Lighthouse Storm Mode
Current key: 'lighthouse Storm Mode'

У меня есть код для чтения / записи. Теперь для полного комплекта, нужно суметь хранить в памяти/получать доступ к элементам дерева.

Возможно подошел бы StringMap, но он не умеет хранить объекты, чтобы на его основе строить многоуровневость.
Я слышал что-то про "Dynamic", но подробно не изучал и уже потерял ссылки на этот класс.
Мне если честно, сейчас не до этого и не хочется много времени этому уделять да и с деревьями я никогда не работал напрямую, поэтому идеально было бы вообще готовое решение в виде SM inc.

Ваши предложения?

-
Прочие ссылки по теме:
Эта же тема на AM.
[Non-SP] KeyValues parsers
KeyValues Extension
KeyValuesToFile with saving keys with void values
Keyvalues #base <sourcefile>
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Dragokas, а глянуть на гитхабе исходники SM?
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
@Grey83,
если ты про SM KeyValues - это просто перенаправление вызовов к Valve API, классу KeyValues.
По StringMap, это хеш-таблица, можно но муторно это переписывать под SourcePawn, да и не так чтобы было большое желание.

@rejchev, не представляю как сослаться одним StringMap на другой StringMap.
Даже если их обернуть массивом и ссылаться через индекс массива, то ArrayList тоже не поддерживает объекты.

Вообщем, я нашел этот Dynamic (от Neuro Toxin), по идее он поддерживает то что мне нужно для создания связанного списка.
Сообщения автоматически склеены:

Хм, похоже я был не прав, StringMap умеет хранить объекты. На этом же принципе как раз построен сам Dynamic.
Тогда, вообще нет никаких проблем, разве что момент с расположением данных в последовательности следования хешей, а не в том порядке, в котором они попадали в таблицу, что является критичным для энумерации данных.
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
@rejchev, не представляю как сослаться одним StringMap на другой StringMap.
Даже если их обернуть массивом и ссылаться через индекс массива, то ArrayList тоже не поддерживает объекты.
Хранить Handle напрямую, как он есть, по-существу.
Для динамического объекта типа StringMap/ArrayList и т.п. справедливо приведение к целочисленному типу (view_as<int>)
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
@rejchev, спасибо, подзабылся.

Предполагаю такую схему эмуляции 1-го ключа KeyValues через мой методмап KeyValuesW:
C-подобный:
ArrayList
|
|-[0]=StringMap ->  | (unordered)
|                   | Key1 = Value1 (typeof String/Int/Float или следующий хендл ArrayList => 2-й ключ KeyValues)
|                   | Key2 = Value2 ...
|                   | Key3 = Value3 ...
|(ordered)
|-[1]=Key1
|-[2]=Key2
|-[3]=Key3

ArrayList умеет хранить только значения.
Мы воспользуемся StringMap для хранения ключа + значения и быстрого доступа.
Однако, StringMap неупорядоченный, поэтому мы зеркально сохраняем все ключи как значения ArrayList, начиная с индекса 1, где их можно будет перечислить в правильном порядке.

Что думаете? Имеет право на жизнь, могут тут быть какие доп. оптимизации?
 
Последнее редактирование:
Сверху Снизу