• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[JASS]Table

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
  • Like
Reactions: deepstrasz
I created this because creating a single hashtable just to be used as a lookup table is expensive(for me in my perspective). Been experiencing that problem so many times.

JASS:
//*************************************************************************************
//*
//*     Table by Almia
//*
//*     Vanilla JASS Implementation of Bribe's Table
//*
//*     Most people will hate me, but this needs to be done.
//*
//*************************************************************************************
//*
//*     API
//*
//*     function InitTable takes nothing returns boolean
//*         - Initialize System, optional
//*     function CreateTable takes nothing returns integer
//*         - Creates table instance
//*     function IsTable takes integer i returns boolean
//*         - Checks if instance is a table
//*     function FlushTable takes integer t returns nothing
//*         - Flushes table memory
//*     function DestroyTable takes integer t returns nothing
//*         - Destroys table
//*
//*     SAVE API
//*
//*    function TableSaveInteger takes integer t, integer key, integer val returns nothing 
//*    function TableSaveReal takes integer t, integer key, real val returns nothing 
//*    function TableSaveBoolean takes integer t, integer key, boolean val returns nothing 
//*    function TableSaveStr takes integer t, integer key, string val returns nothing 
//*
//*    function TableSavePlayer takes integer t, integer key, player val returns nothing 
//*    function TableSaveWidget takes integer t, integer key, widget val returns nothing 
//*    function TableSaveDestructable takes integer t, integer key, destructable val returns nothing 
//*    function TableSaveItem takes integer t, integer key, item val returns nothing 
//*    function TableSaveUnit takes integer t, integer key, unit val returns nothing 
//*    function TableSaveAbility takes integer t, integer key, ability val returns nothing 
//*    function TableSaveTimer takes integer t, integer key, timer val returns nothing 
//*    function TableSaveTrigger takes integer t, integer key, trigger val returns nothing 
//*    function TableSaveTriggerCondition takes integer t, integer key, triggercondition val returns nothing 
//*    function TableSaveTriggerAction takes integer t, integer key, triggeraction val returns nothing 
//*    function TableSaveTriggerEvent takes integer t, integer key, event val returns nothing 
//*    function TableSaveForce takes integer t, integer key, force val returns nothing 
//*    function TableSaveGroup takes integer t, integer key, group val returns nothing 
//*    function TableSaveLocation takes integer t, integer key, location val returns nothing 
//*    function TableSaveRect takes integer t, integer key, rect val returns nothing 
//*    function TableSaveBooleanExpr takes integer t, integer key, boolexpr val returns nothing 
//*    function TableSaveSound takes integer t, integer key, sound val returns nothing 
//*    function TableSaveEffect takes integer t, integer key, effect val returns nothing 
//*    function TableSaveUnitPool takes integer t, integer key, unitpool val returns nothing 
//*    function TableSaveItemPool takes integer t, integer key, itempool val returns nothing 
//*    function TableSaveQuest takes integer t, integer key, quest val returns nothing 
//*    function TableSaveQuestItem takes integer t, integer key, questitem val returns nothing 
//*    function TableSaveDefeatCondition takes integer t, integer key, defeatcondition val returns nothing 
//*    function TableSaveTimerDialog takes integer t, integer key, timerdialog val returns nothing 
//*    function TableSaveLeaderboard takes integer t, integer key, leaderboard val returns nothing 
//*    function TableSaveMultiboard takes integer t, integer key, multiboard val returns nothing 
//*    function TableSaveMultiboardItem takes integer t, integer key, multiboarditem val returns nothing 
//*    function TableSaveTrackable takes integer t, integer key, trackable val returns nothing 
//*    function TableSaveDialog takes integer t, integer key, dialog val returns nothing 
//*    function TableSaveButton takes integer t, integer key, button val returns nothing 
//*    function TableSaveTextTag takes integer t, integer key, texttag val returns nothing 
//*    function TableSaveLightning takes integer t, integer key, lightning val returns nothing 
//*    function TableSaveImage takes integer t, integer key, image val returns nothing 
//*    function TableSaveUbersplat takes integer t, integer key, ubersplat val returns nothing 
//*    function TableSaveRegion takes integer t, integer key, region val returns nothing 
//*    function TableSaveFogState takes integer t, integer key, fogstate val returns nothing 
//*    function TableSaveFogModifier takes integer t, integer key, fogmodifier val returns nothing 
//*    function TableSaveAgent takes integer t, integer key, agent val returns nothing 
//*    function TableSaveHashtable takes integer t, integer key, hashtable val returns nothing 
//*
//*    LOAD API
//*
//*    function TableLoadInteger takes integer t, integer key returns integer  
//*    function TableLoadReal takes integer t, integer key returns real  
//*    function TableLoadBoolean takes integer t, integer key returns boolean  
//*    function TableLoadStr takes integer t, integer key returns string  
//*
//*    function TableLoadPlayer takes integer t, integer key returns player  
//*    function TableLoadWidget takes integer t, integer key returns widget  
//*    function TableLoadDestructable takes integer t, integer key returns destructable  
//*    function TableLoadItem takes integer t, integer key returns item  
//*    function TableLoadUnit takes integer t, integer key returns unit  
//*    function TableLoadAbility takes integer t, integer key returns ability  
//*    function TableLoadTimer takes integer t, integer key returns timer  
//*    function TableLoadTrigger takes integer t, integer key returns trigger  
//*    function TableLoadTriggerCondition takes integer t, integer key returns triggercondition  
//*    function TableLoadTriggerAction takes integer t, integer key returns triggeraction  
//*    function TableLoadTriggerEvent takes integer t, integer key returns event  
//*    function TableLoadForce takes integer t, integer key returns force  
//*    function TableLoadGroup takes integer t, integer key returns group  
//*    function TableLoadLocation takes integer t, integer key returns location  
//*    function TableLoadRect takes integer t, integer key returns rect  
//*    function TableLoadBooleanExpr takes integer t, integer key returns boolexpr  
//*    function TableLoadSound takes integer t, integer key returns sound  
//*    function TableLoadEffect takes integer t, integer key returns effect  
//*    function TableLoadUnitPool takes integer t, integer key returns unitpool  
//*    function TableLoadItemPool takes integer t, integer key returns itempool  
//*    function TableLoadQuest takes integer t, integer key returns quest  
//*    function TableLoadQuestItem takes integer t, integer key returns questitem  
//*    function TableLoadDefeatCondition takes integer t, integer key returns defeatcondition  
//*    function TableLoadTimerDialog takes integer t, integer key returns timerdialog  
//*    function TableLoadLeaderboard takes integer t, integer key returns leaderboard  
//*    function TableLoadMultiboard takes integer t, integer key returns multiboard  
//*    function TableLoadMultiboardItem takes integer t, integer key returns multiboarditem  
//*    function TableLoadTrackable takes integer t, integer key returns trackable  
//*    function TableLoadDialog takes integer t, integer key returns dialog  
//*    function TableLoadButton takes integer t, integer key returns button  
//*    function TableLoadTextTag takes integer t, integer key returns texttag  
//*    function TableLoadLightning takes integer t, integer key returns lightning  
//*    function TableLoadImage takes integer t, integer key returns image  
//*    function TableLoadUbersplat takes integer t, integer key returns ubersplat  
//*    function TableLoadRegion takes integer t, integer key returns region  
//*    function TableLoadFogState takes integer t, integer key returns fogstate  
//*    function TableLoadFogModifier takes integer t, integer key returns fogmodifier  
//*    function TableLoadHashtable takes integer t, integer key returns hashtable  
//*
//*    HAS API
//*
//*    function TableHasInteger takes integer t, integer key returns boolean 
//*    function TableHasReal takes integer t, integer key returns boolean 
//*    function TableHasBoolean takes integer t, integer key returns boolean 
//*    function TableHasString takes integer t, integer key returns boolean 
//*    function TableHasHandle takes integer t, integer key returns boolean 
//*
//*     REMOVE API
//*
//*    function TableRemoveInteger takes integer t, integer key returns nothing  
//*    function TableRemoveReal takes integer t, integer key returns nothing  
//*    function TableRemoveBoolean takes integer t, integer key returns nothing  
//*    function TableRemoveString takes integer t, integer key returns nothing  
//*    function TableRemoveHandle takes integer t, integer key returns nothing  
//*
//*************************************************************************************
//*
//*     Credits
//*
//*     Bribe - Table
//*     Ruke
//*     Nestharus
//*
//*************************************************************************************
function InitTable takes nothing returns boolean
    if udg_Table == null then
        set udg_Table = InitHashtable()
        set udg_Table_R[0] = 1
        return true 
    endif
    return false
endfunction
function FlushTable takes integer t returns nothing
    call FlushChildHashtable(udg_Table, t)
endfunction
function CreateTable takes nothing returns integer
    local integer i = udg_Table_R[0]
    if InitTable() then
        set i = 1
    endif
    if udg_Table_R[i] == 0 then
        set udg_Table_R[0] = i + 1
    else 
        set udg_Table_R[0] = udg_Table_R[i]
        call FlushTable(i)
    endif
    set udg_IsTable[i] = true
    return i
endfunction
function IsTable takes integer i returns boolean
    return udg_IsTable[i]
endfunction
function DestroyTable takes integer t returns nothing
    call FlushTable(t)
    set udg_Table_R[t] = udg_Table_R[0]
    set udg_Table_R[0] = t
    set udg_IsTable[t] = false
endfunction

//*************************************************************************************
//*
//*     Save and Load Handles
//*
//*************************************************************************************
function TableSavePlayer takes integer t, integer key, player val returns nothing 
   if IsTable(t) then 
       call SavePlayerHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadPlayer takes integer t, integer key returns player  
   return LoadPlayerHandle(udg_Table, t, key) 
endfunction 
function TableSaveWidget takes integer t, integer key, widget val returns nothing 
   if IsTable(t) then 
       call SaveWidgetHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadWidget takes integer t, integer key returns widget  
   return LoadWidgetHandle(udg_Table, t, key) 
endfunction 
function TableSaveDestructable takes integer t, integer key, destructable val returns nothing 
   if IsTable(t) then 
       call SaveDestructableHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadDestructable takes integer t, integer key returns destructable  
   return LoadDestructableHandle(udg_Table, t, key) 
endfunction 
function TableSaveItem takes integer t, integer key, item val returns nothing 
   if IsTable(t) then 
       call SaveItemHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadItem takes integer t, integer key returns item  
   return LoadItemHandle(udg_Table, t, key) 
endfunction 
function TableSaveUnit takes integer t, integer key, unit val returns nothing 
   if IsTable(t) then 
       call SaveUnitHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadUnit takes integer t, integer key returns unit  
   return LoadUnitHandle(udg_Table, t, key) 
endfunction 
function TableSaveAbility takes integer t, integer key, ability val returns nothing 
   if IsTable(t) then 
       call SaveAbilityHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadAbility takes integer t, integer key returns ability  
   return LoadAbilityHandle(udg_Table, t, key) 
endfunction 
function TableSaveTimer takes integer t, integer key, timer val returns nothing 
   if IsTable(t) then 
       call SaveTimerHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTimer takes integer t, integer key returns timer  
   return LoadTimerHandle(udg_Table, t, key) 
endfunction 
function TableSaveTrigger takes integer t, integer key, trigger val returns nothing 
   if IsTable(t) then 
       call SaveTriggerHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTrigger takes integer t, integer key returns trigger  
   return LoadTriggerHandle(udg_Table, t, key) 
endfunction 
function TableSaveTriggerCondition takes integer t, integer key, triggercondition val returns nothing 
   if IsTable(t) then 
       call SaveTriggerConditionHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTriggerCondition takes integer t, integer key returns triggercondition  
   return LoadTriggerConditionHandle(udg_Table, t, key) 
endfunction 
function TableSaveTriggerAction takes integer t, integer key, triggeraction val returns nothing 
   if IsTable(t) then 
       call SaveTriggerActionHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTriggerAction takes integer t, integer key returns triggeraction  
   return LoadTriggerActionHandle(udg_Table, t, key) 
endfunction 
function TableSaveTriggerEvent takes integer t, integer key, event val returns nothing 
   if IsTable(t) then 
       call SaveTriggerEventHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTriggerEvent takes integer t, integer key returns event  
   return LoadTriggerEventHandle(udg_Table, t, key) 
endfunction 
function TableSaveForce takes integer t, integer key, force val returns nothing 
   if IsTable(t) then 
       call SaveForceHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadForce takes integer t, integer key returns force  
   return LoadForceHandle(udg_Table, t, key) 
endfunction 
function TableSaveGroup takes integer t, integer key, group val returns nothing 
   if IsTable(t) then 
       call SaveGroupHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadGroup takes integer t, integer key returns group  
   return LoadGroupHandle(udg_Table, t, key) 
endfunction 
function TableSaveLocation takes integer t, integer key, location val returns nothing 
   if IsTable(t) then 
       call SaveLocationHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadLocation takes integer t, integer key returns location  
   return LoadLocationHandle(udg_Table, t, key) 
endfunction 
function TableSaveRect takes integer t, integer key, rect val returns nothing 
   if IsTable(t) then 
       call SaveRectHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadRect takes integer t, integer key returns rect  
   return LoadRectHandle(udg_Table, t, key) 
endfunction 
function TableSaveBooleanExpr takes integer t, integer key, boolexpr val returns nothing 
   if IsTable(t) then 
       call SaveBooleanExprHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadBooleanExpr takes integer t, integer key returns boolexpr  
   return LoadBooleanExprHandle(udg_Table, t, key) 
endfunction 
function TableSaveSound takes integer t, integer key, sound val returns nothing 
   if IsTable(t) then 
       call SaveSoundHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadSound takes integer t, integer key returns sound  
   return LoadSoundHandle(udg_Table, t, key) 
endfunction 
function TableSaveEffect takes integer t, integer key, effect val returns nothing 
   if IsTable(t) then 
       call SaveEffectHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadEffect takes integer t, integer key returns effect  
   return LoadEffectHandle(udg_Table, t, key) 
endfunction 
function TableSaveUnitPool takes integer t, integer key, unitpool val returns nothing 
   if IsTable(t) then 
       call SaveUnitPoolHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadUnitPool takes integer t, integer key returns unitpool  
   return LoadUnitPoolHandle(udg_Table, t, key) 
endfunction 
function TableSaveItemPool takes integer t, integer key, itempool val returns nothing 
   if IsTable(t) then 
       call SaveItemPoolHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadItemPool takes integer t, integer key returns itempool  
   return LoadItemPoolHandle(udg_Table, t, key) 
endfunction 
function TableSaveQuest takes integer t, integer key, quest val returns nothing 
   if IsTable(t) then 
       call SaveQuestHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadQuest takes integer t, integer key returns quest  
   return LoadQuestHandle(udg_Table, t, key) 
endfunction 
function TableSaveQuestItem takes integer t, integer key, questitem val returns nothing 
   if IsTable(t) then 
       call SaveQuestItemHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadQuestItem takes integer t, integer key returns questitem  
   return LoadQuestItemHandle(udg_Table, t, key) 
endfunction 
function TableSaveDefeatCondition takes integer t, integer key, defeatcondition val returns nothing 
   if IsTable(t) then 
       call SaveDefeatConditionHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadDefeatCondition takes integer t, integer key returns defeatcondition  
   return LoadDefeatConditionHandle(udg_Table, t, key) 
endfunction 
function TableSaveTimerDialog takes integer t, integer key, timerdialog val returns nothing 
   if IsTable(t) then 
       call SaveTimerDialogHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTimerDialog takes integer t, integer key returns timerdialog  
   return LoadTimerDialogHandle(udg_Table, t, key) 
endfunction 
function TableSaveLeaderboard takes integer t, integer key, leaderboard val returns nothing 
   if IsTable(t) then 
       call SaveLeaderboardHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadLeaderboard takes integer t, integer key returns leaderboard  
   return LoadLeaderboardHandle(udg_Table, t, key) 
endfunction 
function TableSaveMultiboard takes integer t, integer key, multiboard val returns nothing 
   if IsTable(t) then 
       call SaveMultiboardHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadMultiboard takes integer t, integer key returns multiboard  
   return LoadMultiboardHandle(udg_Table, t, key) 
endfunction 
function TableSaveMultiboardItem takes integer t, integer key, multiboarditem val returns nothing 
   if IsTable(t) then 
       call SaveMultiboardItemHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadMultiboardItem takes integer t, integer key returns multiboarditem  
   return LoadMultiboardItemHandle(udg_Table, t, key) 
endfunction 
function TableSaveTrackable takes integer t, integer key, trackable val returns nothing 
   if IsTable(t) then 
       call SaveTrackableHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTrackable takes integer t, integer key returns trackable  
   return LoadTrackableHandle(udg_Table, t, key) 
endfunction 
function TableSaveDialog takes integer t, integer key, dialog val returns nothing 
   if IsTable(t) then 
       call SaveDialogHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadDialog takes integer t, integer key returns dialog  
   return LoadDialogHandle(udg_Table, t, key) 
endfunction 
function TableSaveButton takes integer t, integer key, button val returns nothing 
   if IsTable(t) then 
       call SaveButtonHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadButton takes integer t, integer key returns button  
   return LoadButtonHandle(udg_Table, t, key) 
endfunction 
function TableSaveTextTag takes integer t, integer key, texttag val returns nothing 
   if IsTable(t) then 
       call SaveTextTagHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadTextTag takes integer t, integer key returns texttag  
   return LoadTextTagHandle(udg_Table, t, key) 
endfunction 
function TableSaveLightning takes integer t, integer key, lightning val returns nothing 
   if IsTable(t) then 
       call SaveLightningHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadLightning takes integer t, integer key returns lightning  
   return LoadLightningHandle(udg_Table, t, key) 
endfunction 
function TableSaveImage takes integer t, integer key, image val returns nothing 
   if IsTable(t) then 
       call SaveImageHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadImage takes integer t, integer key returns image  
   return LoadImageHandle(udg_Table, t, key) 
endfunction 
function TableSaveUbersplat takes integer t, integer key, ubersplat val returns nothing 
   if IsTable(t) then 
       call SaveUbersplatHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadUbersplat takes integer t, integer key returns ubersplat  
   return LoadUbersplatHandle(udg_Table, t, key) 
endfunction 
function TableSaveRegion takes integer t, integer key, region val returns nothing 
   if IsTable(t) then 
       call SaveRegionHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadRegion takes integer t, integer key returns region  
   return LoadRegionHandle(udg_Table, t, key) 
endfunction 
function TableSaveFogState takes integer t, integer key, fogstate val returns nothing 
   if IsTable(t) then 
       call SaveFogStateHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadFogState takes integer t, integer key returns fogstate  
   return LoadFogStateHandle(udg_Table, t, key) 
endfunction 
function TableSaveFogModifier takes integer t, integer key, fogmodifier val returns nothing 
   if IsTable(t) then 
       call SaveFogModifierHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadFogModifier takes integer t, integer key returns fogmodifier  
   return LoadFogModifierHandle(udg_Table, t, key) 
endfunction 
function TableSaveHashtable takes integer t, integer key, hashtable val returns nothing 
   if IsTable(t) then 
       call SaveHashtableHandle(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadHashtable takes integer t, integer key returns hashtable  
   return LoadHashtableHandle(udg_Table, t, key) 
endfunction
//*************************************************************************************
//*
//*     Save Load Integer, Real, Boolean, String
//*
//*************************************************************************************
function TableSaveInteger takes integer t, integer key, integer val returns nothing 
   if IsTable(t) then 
       call SaveInteger(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadInteger takes integer t, integer key returns integer  
   return LoadInteger(udg_Table, t, key) 
endfunction 
function TableSaveReal takes integer t, integer key, real val returns nothing 
   if IsTable(t) then 
       call SaveReal(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadReal takes integer t, integer key returns real  
   return LoadReal(udg_Table, t, key) 
endfunction 
function TableSaveBoolean takes integer t, integer key, boolean val returns nothing 
   if IsTable(t) then 
       call SaveBoolean(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadBoolean takes integer t, integer key returns boolean  
   return LoadBoolean(udg_Table, t, key) 
endfunction 
function TableSaveStr takes integer t, integer key, string val returns nothing 
   if IsTable(t) then 
       call SaveStr(udg_Table, t, key, val) 
   endif 
endfunction 
function TableLoadStr takes integer t, integer key returns string  
   return LoadStr(udg_Table, t, key) 
endfunction 
//*************************************************************************************
//*
//*     Save Agent
//*
//*************************************************************************************
function TableSaveAgent takes integer t, integer key, agent val returns nothing 
   if IsTable(t) then 
       call SaveAgentHandle(udg_Table, t, key, val) 
   endif 
endfunction
//*************************************************************************************
//*
//*     Has / Remove Functionality
//*
//*************************************************************************************
function TableHasInteger takes integer t, integer key returns boolean 
   return HaveSavedInteger(udg_Table, t, key) 
endfunction 
function TableRemoveInteger takes integer t, integer key returns nothing  
   call RemoveSavedInteger(udg_Table, t, key) 
endfunction 
function TableHasReal takes integer t, integer key returns boolean 
   return HaveSavedReal(udg_Table, t, key) 
endfunction 
function TableRemoveReal takes integer t, integer key returns nothing  
   call RemoveSavedReal(udg_Table, t, key) 
endfunction 
function TableHasBoolean takes integer t, integer key returns boolean 
   return HaveSavedBoolean(udg_Table, t, key) 
endfunction 
function TableRemoveBoolean takes integer t, integer key returns nothing  
   call RemoveSavedBoolean(udg_Table, t, key) 
endfunction 
function TableHasString takes integer t, integer key returns boolean 
   return HaveSavedString(udg_Table, t, key) 
endfunction 
function TableRemoveString takes integer t, integer key returns nothing  
   call RemoveSavedString(udg_Table, t, key) 
endfunction 
function TableHasHandle takes integer t, integer key returns boolean 
   return HaveSavedHandle(udg_Table, t, key) 
endfunction 
function TableRemoveHandle takes integer t, integer key returns nothing  
   call RemoveSavedHandle(udg_Table, t, key) 
endfunction
Example:
JASS:
function Example takes nothing returns nothing
    //call InitTable()
    local integer t = CreateTable()
    local integer i1 = 10
    local integer i2 = 17
    local integer i3 = 1997
    //insert values to table
    call TableSaveInteger(t, 1, i1)
    call TableSaveInteger(t, 2, i2)
    call TableSaveInteger(t, 3, i3)
    call TableSaveStr(t, 4, "Almia")
    call TableSaveUnit(t, 5, gg_unit_Hpal_0001)
    //Check values
    if TableHasInteger(t, 1) then
        call BJDebugMsg("Table slot 1 not empty")
    endif
    if TableHasString(t, 4) then
        call BJDebugMsg("Table slot 4 not empty")
    endif
    if TableHasHandle(t, 5) then
        call BJDebugMsg("Table slot 5 not empty")
    endif
    //Load values
    set i1 = TableLoadInteger(t, 1)
    set i2 = TableLoadInteger(t, 2)
    set i3 = TableLoadInteger(t, 3)
    call BJDebugMsg(TableLoadStr(t, 4) + "'s Bday is : " + I2S(i1) + "/" + I2S(i2) + "/"  + I2S(i3))
    call KillUnit(TableLoadUnit(t, 5))
    //Flush table
    call FlushTable(t)
    //Destroy table
    call DestroyTable(t)
endfunction

function InitTrig_Example takes nothing returns nothing
    call Example()
endfunction

Changelogs:
1.0
- Released

Keywords:
Monstrosity, Macro, Table, Bribe's Table, Large Array, Hashtable, Indexing, Blah blah
Contents

Table (Map)

Reviews
24th Mar 2016 Your resource has been reviewed by BPower. In case of any questions or for reconfirming the moderator's rating, please make use of the Quick Reply function of this thread. Review: Table as we know is one of the most useful...

Moderator

M

Moderator

24th Mar 2016

General Info

Your resource has been reviewed by BPower.
In case of any questions or for reconfirming the moderator's rating,
please make use of the Quick Reply function of this thread.
Review:

Table as we know is one of the most useful resources out there. Not only because it reduces the amount of
required hashtables to a minimum, but also because of the fancy API, TableArray and the HashTable struct.
The target group for your JASS Table are the pure JASS coders, vJass + JASS hybrids would draw on Table.
GUI'ers don't really benefit, because the hashtable API is poor supported in GUI.
Therefore the target group is very small.

The code comprises:
1.) udg_GlobalHash
2.) CreateTable() --> index
3.) DestroyTable(index)
which is very easy to reproduce if really wanted.

I highly appreciate your effort in writing a good documentation.
But finally this is a snippet coded just for the fun of coding.
I consulted another moderator in charge to discuss about your JASS Table resource
and decided to reject JASS Table.
Please send me a PM if you strongly disagree.

Troubleshooting:

  • Code wise everything is fine.
 
~Reserved

I'm not trolling.

Also for those who might ask why I have that kind of screenshot, Mag said that if a resource is impossible to provide one, then provide any kind of images that is related to your resource.

I also submitted this here instead of the Jass Section is that most map makers would think that Jass Section is just a section full of vJass resources. And also this is to prevent confusion to the existing library.
 
Last edited:
Level 12
Joined
Jan 2, 2016
Messages
973
Okay, I look at this, and I don't really see the point of it.
From what I see, you are basically replacing the parent key with a unique value (integer).
And I suppose if you want to attach data to a unit, you'd need to index the unit, and save this key into a variable array, with the same index?
Or perhaps save the integer into ANOTHER (normal) hashtable, with parent - the unit's handle id, but then what would be the point??
The only thing I could think about is: Make a 'Table', load integer from a "normal" table with parent - the unit's handle id, and child 0, increase it by 1, and re-save it into the "normal" table, then save the integer (id) of the 'Table' into the field with parent key - the unit's handle id, and child - the value (after being increased by 1). This way you could simulate having multiple hashtables, but then you'd need to know which field holds the right parent key....
Perhaps you could keep a 'Table', with info what do the next fields hold, but that would make things way too confusing xP

If anything, I'd like to see a hashtable with 3 keys, instead of 2 (or 1, like this one).

EDIT: Don't think that I don't appreciate your system, it's just that at the moment I can't see how is it better than a 'normal' hashtable :p

EDIT 2: You think something like this would work well for a hashtable with 3 keys?:
JASS:
library Table4D

    globals
        private hashtable T1 = InitHashtable()
        private hashtable T2 = InitHashtable()
        private hashtable T3 = InitHashtable()
        private constant string EMPTY = ""
    endglobals

    function CreateTable4D takes integer k1, integer k2 returns nothing
        local integer i = LoadInteger(T3, 0, 1)
        local integer c
        if k1 >= 0 and k2 >=0 and not LoadBoolean(T3, k1 + 1, k2) then
            if i == 0 then
                set i = LoadInteger(T3, 0, 0)
                call SaveInteger(T2, k1, k2, i)
                call SaveInteger(T3, 0, 0, i + 1)
            else
                set c = LoadInteger(T3, 0, i + 1)
                call RemoveSavedInteger(T3, 0, i + 1)
                call SaveInteger(T3, 0, 1, i - 1)
                call SaveInteger(T2, k1, k2, c)
            endif
            call SaveBoolean(T3, k1 + 1, k2, true)
        endif
    endfunction
    
    function DestroyTable4D takes integer k1, integer k2 returns nothing
        local integer i = LoadInteger(T3, 0, 1) + 1
        local integer c = LoadInteger(T2, k1, k2)
        if k1 >= 0 and k2 >=0 and LoadBoolean(T3, k1 + 1, k2) then
            call RemoveSavedInteger(T2, k1, k2)
            call FlushChildHashtable(T1, c)
            call SaveInteger(T3, 0, i + 1, c)
            set c = LoadInteger(T3, 0, 0)
            if c == i then
                call FlushChildHashtable(T3, 0)
            else
                call SaveInteger(T3, 0, 1, i)
            endif
            call RemoveSavedBoolean(T3, k1 + 1, k2)
        endif
    endfunction
    
    function FlushChildHashtable4D takes integer k1, integer k2 returns nothing
        local integer k4
        if HaveSavedInteger(T2, k1, k2) then
            set k4 = LoadInteger(T2, k1, k2)
            call FlushChildHashtable(T1, k4)
        endif
    endfunction

//! textmacro HasSavedNRemoveSaved takes NAME
    function HaveSaved$NAME$4D takes integer k1, integer k2, integer k3 returns boolean
        local integer k4
        if HaveSavedInteger(T2, k1, k2) then
            set k4 = LoadInteger(T2, k1, k2)
            return HaveSaved$NAME$(T1, k4, k3)
        endif
        return false
    endfunction

    function RemoveSaved$NAME$4D takes integer k1, integer k2, integer k3 returns nothing
        local integer k4
        if HaveSavedInteger(T2, k1, k2) then
            set k4 = LoadInteger(T2, k1, 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$4D takes integer k1, integer k2, integer k3, $TYPE$ val returns nothing
        local integer k4
        if HaveSavedInteger(T2, k1, k2) then
            set k4 = LoadInteger(T2, k1, k2)
            call Save$NAME$$HANDLE$(T1, k4, k3, val)
        endif
    endfunction
    
    function Load$NAME$$HANDLE$4D takes integer k1, integer k2, integer k3 returns $TYPE$
        local integer k4
        if HaveSavedInteger(T2, k1, k2) then
            set k4 = LoadInteger(T2, k1, 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

EDIT 3: Ha! who would've tought it would be so simple to make a hashtable with 3 keys :D
 
Last edited:
Level 10
Joined
Aug 21, 2010
Messages
316
I created this because creating a single hashtable just to be used as a lookup table is expensive

If I understand you correctly.

For any map is enough to have one or two htables, so that this or anything like this totally unnecessary.

What's wrong with normal htable???
 
Level 10
Joined
Aug 21, 2010
Messages
316
Not exactly. I use one hashtable per recourse pretty much.
Import 20 spells and 20 systems to your map from the spell section and see how many you end up with.

I have never used anything in this section so I have no problem with importing.
So that, as I said, enough is 1 or 2 htables

EDIT -
The only thing I use on this site are models and skins.
 
That's sad to hear, given the fact that new patches introduced new APIs and many of the spells/libs are in need of an update/ refactor e.g.: adjustment for 24 players.

Maybe, just maybe, I'll comeback modding once I got a 1.29 Wc3 (I do not have a "paid" version, I only have a pirated one. Just Filipino Things). Although, it would be hard for me since it could affect my job.
 
Top