Безопасное выделение hashtable

Published
» Способ реализации: vJass
» Тип: Алгоритм
» Версия Warcraft: 1.26a+
Как известно, функцию InitHashtable() можно вызывать ограниченное количество раз. Поэтому для динамического выделения нативных хеш-таблиц нужен буфер, с помощью которого можно было бы переиспользовать уже созданные хеш-таблицы. Данная библиотека предоставляет 2 метода:
local hashtable ht = HT_create() // для получения hashtable из буфера
call HT_destroy(ht) // для отправки hashtable в буфер
Повторный вызов HT_destroy() ничего не сломает. Если использовать методы одной библиотеки внутри другой, то ее следует указать в зависимостях.
library HT
    globals
        private hashtable array ht
        private boolean array allocated
        private integer max = -1
    endglobals
    
    public function create takes nothing returns hashtable
        local integer i = 0
        loop
        exitwhen i > max
            if not allocated[i] then
                set allocated[i] = true
                return ht[i]
            endif
        set i = i+1
        endloop
        set max = max+1
        set ht[max] = InitHashtable()
        set allocated[max] = true
        return ht[max]
    endfunction
    
    public function destroy takes hashtable h returns nothing
    local integer i = 0
    if h != null then
        loop
        exitwhen i > max
            if ht[i] == h then
                set allocated[i] = false
                return
            endif
        set i = i+1
        endloop
    endif
    endfunction
    
endlibrary


Views: 107

KaneThaumaturge #1 - 6 days ago 0
Голосов: +0 / -0
Интересно для чего может понадобиться динамически создавать хэш-таблицы?
PT153 #2 - 6 days ago 0
Голосов: +0 / -0
KaneThaumaturge, для чего в принципе может понадобится 2 хештаблицы.
quq_CCCP #3 - 6 days ago 0
Голосов: +0 / -0
Хм, ну очень сомнительно, ну 1, ну 2, ну 10, но 256+ то нах?
PT153, Они так разграничивают данные, StringhHash не научились юзать.
GetLocalPlayer #4 - 5 days ago (изм. ) 0
Голосов: +0 / -0
PT153:
KaneThaumaturge, для чего в принципе может понадобится 2 хештаблицы.
Реализовать хэш-мап (+1 таблица).
Реализовать список на хэш-таблице (+1 таблица)
Использовать в качестве ключа что-то кроме хэндл ид (хэш строки, например) избегая коллизий (+1 таблица).
У тебя может быть способность, которая должна сохранять данные на касетра + цель. При этом целей может быть несколько. Следовательно, в key идет ид кастера, в value ид всех целей. Если таких способностей несколько, +1 таблица на каждую.
Vlod #5 - 5 days ago 0
Голосов: +0 / -0
Обновление
Убрана строка, которая автоочищает таблицу. После вызова функции FlushParentHashtable() невозможно повторно сохранять значения.
call FlushParentHashtable(h)
KaneThaumaturge #6 - 5 days ago (изм. ) 0
Голосов: +0 / -0
У тебя может быть способность, которая должна сохранять данные на касетра + цель. При этом целей может быть несколько. Следовательно, в key идет ид кастера, в value ид всех целей. Если таких способностей несколько, +1 таблица на каждую.
Создать группу целей и привязать ее к кастеру.

Не знаю, может я чего-то не понимаю.
GetLocalPlayer #7 - 5 days ago (изм. ) 0
Голосов: +0 / -0
Создать группу целей и привязать ее к кастеру.
Ну так тебе нужно хранить данные не по кастер + группа целей, а кастер + цель. Для каждой цели каждого кастера свой индивидуальный набор данных.
KaneThaumaturge #8 - 5 days ago 0
Голосов: +0 / -0
GetLocalPlayer, Что тут сложного? Зачем более 1 хэштаблицы? На структурах все сохраняется, хотя можно и без них.

GetLocalPlayer, А можно пример способности?
GetLocalPlayer #9 - 5 days ago (изм. ) 0
Голосов: +0 / -0
GetLocalPlayer, А можно пример способности?
Просто описать? Тогда яд.
Травит цель, нанося 100 ед. урона каждую секунду в течении 15 секунд. Перезарядка 1 секунда. Эффекты от разных кастеров на одну цель друг друга не перебивают, каждый работает индивидуально.
KaneThaumaturge #10 - 5 days ago 0
Голосов: +0 / -0
GetLocalPlayer, Если сделаю с одной хэш-таблицей мне полагается приз?
GetLocalPlayer #11 - 5 days ago 0
Голосов: +0 / -0
KaneThaumaturge:
GetLocalPlayer, Если сделаю с одной хэш-таблицей мне полагается приз?
Тебя куда-то не туда унесло.
Bergi_Bear #12 - 5 days ago 0
Голосов: +0 / -0
Сделаю без единой хештаблицы на гуи в пачте Roc 1.00 или на ретурбаге, мы же соревнуемся на самую убогую и костыльную реализацию одного и того же?
KaneThaumaturge #13 - 5 days ago 0
Голосов: +0 / -0
Тебя куда-то не туда унесло.
Мне просто правда интересно зачем это и как можно использовать. В описанной тобой способности данные просто сохраняются на хэндл таймера, все работает индивидуально и не перебивает друг друга.
GetLocalPlayer #14 - 4 days ago (изм. ) 0
Голосов: +0 / -0
В описанной тобой способности данные просто сохраняются на хэндл таймера, все работает индивидуально и не перебивает друг друга.
Хорошо, мы сохраняем данные по хэндлу таймера. Затем я применил яд повторно, до того как он закончил свое действие. То есть, обновил оставшееся время действия. Как я найду таймер, чтобы обновить данные?
ScopteRectuS #15 - 4 days ago (изм. ) 0
Голосов: +0 / -0
GetLocalPlayer, просто создаешь еще один таймер, они же работают индивидуально. К тому же таймер один из самых лёгких объектов в игре. Все лучше, чем создавать ещё одну хеш-таблицу.
PT153 #16 - 4 days ago (изм. ) 2
Голосов: +2 / -0
GetLocalPlayer, у меня это сделано структурами и на одной хештаблице.

Сейчас вообще Hate придёт и скажет, что хештаблица тут не нужна.
Vlod #17 - 1 day ago 0
Голосов: +0 / -0
quq_CCCP, одновременно использоваться могут и 3-7, главное, что они динамически выделяются и освобождаются