struct allocator queries

hgkjfhfdsj

Active Member
Reaction score
55
i was looking through the jass conversion of a vjass code and i found a few questions/ in of further elaboration

JASS:
function s__MeatHook___Data__allocate takes nothing returns integer
 local integer this=si__MeatHook___Data_F
    if (this!=0) then
        set si__MeatHook___Data_F=si__MeatHook___Data_V[this]
    else
        set si__MeatHook___Data_I=si__MeatHook___Data_I+1
        set this=si__MeatHook___Data_I
    endif
    if (this>8190) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Unable to allocate id for an object of type: MeatHook___Data")
        return 0
    endif

   set s__MeatHook___Data_extending[this]= false //fields
   set s__MeatHook___Data_linknumber[this]=0 //fields
    set si__MeatHook___Data_V[this]=-1
 return this
endfunction

//Generated destructor of MeatHook___Data
function s__MeatHook___Data_deallocate takes integer this returns nothing
    if this==null then
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Attempt to destroy a null struct of type: MeatHook___Data")
        return
    elseif (si__MeatHook___Data_V[this]!=-1) then
            call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,1000.,"Double free of type: MeatHook___Data")
        return
    endif
    set si__MeatHook___Data_V[this]=si__MeatHook___Data_F
    set si__MeatHook___Data_F=this
endfunction


what is the purpose of ....Data_F? i cant seem to see the logic behind the Data_F in the allocation process :confused:
initial value i saw was set to 0
ty.

EDIT
after rereading it i understood something.. i think..
correct me if im wrong. ive gathered that,
allocator works like a singly linked list (?):
V[this] holds either -1(in use), or the head's next node
I = index allocator
F = head of recycled indexes

EDIT2
JASS:
globals
    integer instanceCount = 0
    integer array recycle
    integer recycleCount = 0
endglobals

function allocate takes nothing returns integer
    if (recycleCount != 0) then
        set recycleCount = recycleCount - 1
        return recycle[recycleCount]
    endif
    set instanceCount = instanceCount + 1
    return instanceCount
endfunction

function deallocate takes integer this returns nothing
    set recycle[recycleCount] = this
    set recycleCount = recycleCount + 1
endfunction


found in (posted by nestharus) -- which allocator method would be most preferred for a vanilla jass user implementing pseudo/selfmade structs? :(.
 

Bribe

vJass errors are legion
Reaction score
67
JASS:
after rereading it i understood something.. i think..
correct me if im wrong. ive gathered that,
allocator works like a singly linked list (?):
V[this] holds either -1(in use), or the head's next node
I = index allocator
F = head of recycled indexes


Yes across the board.

which allocator method would be most preferred for a vanilla jass user implementing pseudo/selfmade structs? .

The standard ones by Vexorian have double-free protection, which is good to have. Though if you have an array struct like nestharus, you cannot have stub methods/ extends struct/ extends interface/ onDestroy recognition/ any kind of inheritance. You have to forge it all with modules/ delegates, which can be taxing on the map file size if you have a huge module you have to import many times just for inheritance.
 

Nestharus

o-o
Reaction score
84
Actually Bribe, the map size would be less to the same by making it from scratch = P. Remember, stub methods and etc have to be translated into JASS code = ).

most of the time, doing it from scratch = less code and is more efficient for the occasion

The only issue with doing it from scratch is that it's tedious ; O.
 

Bribe

vJass errors are legion
Reaction score
67
If you have a 700-line long parent struct and have to convert it to a module to be imported into many would-be "child structs", you are increasing your map file size by way more than you would with the alternative. One of the reasons the gazillion-line-long Spell Struct freaks me out so much.
 

Bribe

vJass errors are legion
Reaction score
67
You know how it's a pretty simple process to extend a parent struct? The idea behind this whole thing is to make it a simple, user-friendly process to use a callback system I developed.

Look at a parent struct that calls an overridable "onLoop" method. The user only has to do:

JASS:
struct child extends parent
    method onLoop takes nothing returns nothing
        call BJDebugMsg(I2S(this))
    endmethod
endstruct


And, instead of doing parent.create(), they do child.create().

Is there something this simple for a user to pick up on that uses user-crafted delegates/triggers?
 

hgkjfhfdsj

Active Member
Reaction score
55
You have to forge it all with modules/ delegates, which can be taxing on the map file size if you have a huge module you have to import many times just for inheritance.
cant do that anyways..mac users, gotta do the c&p way -___-

ill go for the array struct.. not that i really need any kind of inheritance (or something) atm..

ty both :)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top