JASS:
library TableSpecial
globals
private hashtable T1 = InitHashtable()
private hashtable T2 = InitHashtable()
private constant string EMPTY = ""
endglobals
function CreateTableSpecial takes integer k1, integer k2 returns nothing
local integer i = LoadInteger(T2, 0, 1)
local integer c
if k1 >= 0 and not HaveSavedInteger(T2, k1 + 1, k2) then
if i == 0 then
set i = LoadInteger(T2, 0, 0)
call SaveInteger(T2, k1 + 1, k2, i)
call SaveInteger(T2, 0, 0, i + 1)
else
set c = LoadInteger(T2, 0, i + 1)
call RemoveSavedInteger(T2, 0, i + 1)
call SaveInteger(T2, 0, 1, i - 1)
call SaveInteger(T2, k1 + 1, k2, c)
endif
endif
endfunction
function DestroyTableSpecial takes integer k1, integer k2 returns nothing
local integer i = LoadInteger(T2, 0, 1) + 1
local integer c = LoadInteger(T2, k1 + 1, k2)
if k1 >= 0 and HaveSavedInteger(T2, k1 + 1, k2) then
call RemoveSavedInteger(T2, k1 + 1, k2)
call FlushChildHashtable(T1, c)
call SaveInteger(T2, 0, i + 1, c)
set c = LoadInteger(T2, 0, 0)
if c == i then
call FlushChildHashtable(T2, 0)
else
call SaveInteger(T2, 0, 1, i)
endif
endif
endfunction
function FlushChildHashtableSpecial takes integer k1, integer k2 returns nothing
local integer k4
if HaveSavedInteger(T2, k1 + 1, k2) then
set k4 = LoadInteger(T2, k1 + 1, k2)
call FlushChildHashtable(T1, k4)
endif
endfunction
//! textmacro HasSavedNRemoveSaved takes NAME
function HaveSaved$NAME$Special takes integer k1, integer k2, integer k3 returns boolean
local integer k4
if HaveSavedInteger(T2, k1 + 1, k2) then
set k4 = LoadInteger(T2, k1 + 1, k2)
return HaveSaved$NAME$(T1, k4, k3)
endif
return false
endfunction
function RemoveSaved$NAME$Special takes integer k1, integer k2, integer k3 returns nothing
local integer k4
if HaveSavedInteger(T2, k1 + 1, k2) then
set k4 = LoadInteger(T2, k1 + 1, k2)
call RemoveSaved$NAME$(T1, k4, k3)
endif
endfunction
//! endtextmacro
//! runtextmacro HasSavedNRemoveSaved("Integer")
//! runtextmacro HasSavedNRemoveSaved("Real")
//! runtextmacro HasSavedNRemoveSaved("Handle")
//! runtextmacro HasSavedNRemoveSaved("Boolean")
//! runtextmacro HasSavedNRemoveSaved("String")
//! textmacro SaveNLoad takes NAME, TYPE, HANDLE, VAL
function Save$NAME$$HANDLE$Special takes integer k1, integer k2, integer k3, $TYPE$ val returns nothing
local integer k4
if HaveSavedInteger(T2, k1 + 1, k2) then
set k4 = LoadInteger(T2, k1 + 1, k2)
call Save$NAME$$HANDLE$(T1, k4, k3, val)
endif
endfunction
function Load$NAME$$HANDLE$Special takes integer k1, integer k2, integer k3 returns $TYPE$
local integer k4
if HaveSavedInteger(T2, k1 + 1, k2) then
set k4 = LoadInteger(T2, k1 + 1, k2)
return Load$NAME$$HANDLE$(T1, k4, k3)
endif
return $VAL$
endfunction
//! endtextmacro
//! runtextmacro SaveNLoad("Boolean","boolean","","false")
//! runtextmacro SaveNLoad("Str","string","","EMPTY")
//! runtextmacro SaveNLoad("Real","real","","0.00")
//! runtextmacro SaveNLoad("Integer","integer","","0")
//! runtextmacro SaveNLoad("Player","player","Handle","null")
//! runtextmacro SaveNLoad("Widget","widget","Handle","null")
//! runtextmacro SaveNLoad("Destructable","destructable","Handle","null")
//! runtextmacro SaveNLoad("Item","item","Handle","null")
//! runtextmacro SaveNLoad("Unit","unit","Handle","null")
//! runtextmacro SaveNLoad("Ability","ability","Handle","null")
//! runtextmacro SaveNLoad("Timer","timer","Handle","null")
//! runtextmacro SaveNLoad("Trigger","trigger","Handle","null")
//! runtextmacro SaveNLoad("TriggerCondition","triggercondition","Handle","null")
//! runtextmacro SaveNLoad("TriggerAction","triggeraction","Handle","null")
//! runtextmacro SaveNLoad("TriggerEvent","event","Handle","null")
//! runtextmacro SaveNLoad("Force","force","Handle","null")
//! runtextmacro SaveNLoad("Group","group","Handle","null")
//! runtextmacro SaveNLoad("Location","location","Handle","null")
//! runtextmacro SaveNLoad("Rect","rect","Handle","null")
//! runtextmacro SaveNLoad("BooleanExpr","boolexpr","Handle","null")
//! runtextmacro SaveNLoad("Sound","sound","Handle","null")
//! runtextmacro SaveNLoad("Effect","effect","Handle","null")
//! runtextmacro SaveNLoad("UnitPool","unitpool","Handle","null")
//! runtextmacro SaveNLoad("ItemPool","itempool","Handle","null")
//! runtextmacro SaveNLoad("Quest","quest","Handle","null")
//! runtextmacro SaveNLoad("QuestItem","questitem","Handle","null")
//! runtextmacro SaveNLoad("DefeatCondition","defeatcondition","Handle","null")
//! runtextmacro SaveNLoad("TimerDialog","timerdialog","Handle","null")
//! runtextmacro SaveNLoad("Leaderboard","leaderboard","Handle","null")
//! runtextmacro SaveNLoad("Multiboard","multiboard","Handle","null")
//! runtextmacro SaveNLoad("MultiboardItem","multiboarditem","Handle","null")
//! runtextmacro SaveNLoad("Trackable","trackable","Handle","null")
//! runtextmacro SaveNLoad("Dialog","dialog","Handle","null")
//! runtextmacro SaveNLoad("Button","button","Handle","null")
//! runtextmacro SaveNLoad("TextTag","texttag","Handle","null")
//! runtextmacro SaveNLoad("Lightning","lightning","Handle","null")
//! runtextmacro SaveNLoad("Image","image","Handle","null")
//! runtextmacro SaveNLoad("Ubersplat","ubersplat","Handle","null")
//! runtextmacro SaveNLoad("Region","region","Handle","null")
//! runtextmacro SaveNLoad("FogState","fogstate","Handle","null")
//! runtextmacro SaveNLoad("FogModifier","fogmodifier","Handle","null")
//! runtextmacro SaveNLoad("Hashtable","hashtable","Handle","null")
endlibrary
I just made it today for 20 mins, so there must be things to improve.
Can anyone point out what could be improved, and how?
(Besides the textmacro, I kind a already know I should improve the 1-st one)
EDIT: Okay, fixed a bug, and improved the textmacro, improved the destructing method, what now?
EDIT 2: The way it was before wasn't really working, so I changed this and that
EDIT 3: Made it safe to use
EDIT 4: I could make it simpler - have only 2 hashtables, and a integer.
When a table is created - it gives it the value of the integer, and increases the integer's value by 1. After that - I never remove that value from the field.
Which way is better? Having 3 tables, or 2 tables + integer, but be unable to clear the tables completely
And meanwhilie - I prevented saving/loading any values into undeclared tables
Last edited: