- Reaction score
- 333
Version 2.0
Huge changes. Now we can:
Internal changes:
Caveat Utilitor:
Huge changes. Now we can:
- Use user-defined types in maps.
- Create maps dynamically, at run-time. Each individual map is completely separate from the others.
- Iterate through the contents of individual maps.
- Map maps to other maps, creating multi-maps.
Internal changes:
- Each map (no matter the type) shares globals.
- As few superfluous declarations as possible.
- Size argument removed.
Caveat Utilitor:
- Don't create more than 8190 maps at once.
- Don't forget to clear entries after use.
- Don't use more than 8190 entries at once.
JASS:
//! textmacro Map takes NAME, TYPE1, TYPE2
library_once integer2i
globals
public integer array c
public integer array e_id
public integer array e_ids
public integer e_n = 0
public integer e_m = 0
public integer array e_u
public integer array e_d
public integer array e_l
public integer array e_r
endglobals
function integer2i takes integer i returns integer
return i
endfunction
public function H2I takes handle h returns integer
return h
return 0
endfunction
public function CX takes integer x returns integer
if (x<0) then
return x+8190
endif
return x
endfunction
function real2i_CX takes integer x returns integer
return CX(x)
endfunction
function handle2i takes handle t returns integer
return H2I(t)-0x100000
endfunction
public interface mapinstance
integer ns
integer ef
integer it
endinterface
endlibrary
library_once $TYPE1$2globs
globals
$TYPE1$ array $TYPE1$2i_e_k
$TYPE1$ $TYPE1$2i_no_$TYPE1$ = $TYPE1$2i_e_k[0]
endglobals
endlibrary
library_once handle2i
endlibrary
library_once real2CXs
endlibrary
library_once integer2CXs
endlibrary
library_once $TYPE1$2CXs
function $TYPE1$2i_CX takes integer x returns integer
return x
endfunction
endlibrary
library_once $TYPE1$2i
function $TYPE1$2i takes $TYPE1$ t returns integer
return t
return 0
endfunction
endlibrary
library_once $TYPE2$s
globals
public $TYPE2$ array e_v
public $TYPE2$ no_$TYPE2$ = e_v[0]
endglobals
endlibrary
library $NAME$ requires $TYPE1$2i, integer2i
struct $NAME$ extends integer2i_mapinstance
private integer ns = 0
private integer ef = 0
private integer it
method empty takes nothing returns boolean
return .ns == 0
endmethod
method size takes nothing returns integer
return .ns
endmethod
method clearValue takes $TYPE1$ tk returns nothing
local integer i = $TYPE1$2i(tk)+this
local integer x = $TYPE1$2i_CX(i-(i/8190)*8190)+1
set i = integer2i_c[x]
loop
exitwhen i == 0
if ($TYPE1$2i_e_k<i> == tk and integer2i_e_id<i> == this) then
if (integer2i_c[x] == i) then
set integer2i_c[x] = integer2i_e_u<i>
else
set integer2i_e_u[integer2i_e_d<i>] = integer2i_e_u<i>
endif
set integer2i_e_d[integer2i_e_u<i>] = integer2i_e_d<i>
if (.ef == i) then
set .ef = integer2i_e_r<i>
else
set integer2i_e_r[integer2i_e_l<i>] = integer2i_e_r<i>
endif
set integer2i_e_l[integer2i_e_r<i>] = integer2i_e_l<i>
set $TYPE1$2i_e_k<i> = $TYPE1$2i_no_$TYPE1$
set $TYPE2$s_e_v<i> = $TYPE2$s_no_$TYPE2$
set integer2i_e_ids[integer2i_e_n] = i
set integer2i_e_n = integer2i_e_n+1
set .ns = .ns-1
return
endif
set i = integer2i_e_u<i>
endloop
endmethod
method getValue takes $TYPE1$ tk returns $TYPE2$
local integer i = $TYPE1$2i(tk)+this
set i = integer2i_c[$TYPE1$2i_CX(i-(i/8190)*8190)+1]
loop
exitwhen i == 0
if ($TYPE1$2i_e_k<i> == tk and integer2i_e_id<i> == this) then
return $TYPE2$s_e_v<i>
endif
set i = integer2i_e_u<i>
endloop
return $TYPE2$s_no_$TYPE2$
endmethod
method setValue takes $TYPE1$ tk, $TYPE2$ tv returns nothing
local integer i = $TYPE1$2i(tk)+this
local integer x = $TYPE1$2i_CX(i-(i/8190)*8190)+1
set i = integer2i_c[x]
loop
exitwhen i == 0
if ($TYPE1$2i_e_k<i> == tk and integer2i_e_id<i> == this) then
set $TYPE2$s_e_v<i> = tv
return
endif
set i = integer2i_e_u<i>
endloop
if (integer2i_e_n == 0) then
set integer2i_e_m = integer2i_e_m+1
set i = integer2i_e_m
else
set integer2i_e_n = integer2i_e_n-1
set i = integer2i_e_ids[integer2i_e_n]
endif
set $TYPE1$2i_e_k<i> = tk
set $TYPE2$s_e_v<i> = tv
set integer2i_e_id<i> = this
set integer2i_e_u<i> = integer2i_c[x]
set integer2i_e_d<i> = 0
set integer2i_e_d[integer2i_c[x]] = i
set integer2i_c[x] = i
set integer2i_e_r<i> = .ef
set integer2i_e_l<i> = 0
set integer2i_e_l[.ef] = i
set .ef = i
set .ns = .ns+1
endmethod
method operator [] takes $TYPE1$ tk returns $TYPE2$
return .getValue(tk)
endmethod
method operator []= takes $TYPE1$ tk, $TYPE2$ tv returns nothing
call .setValue(tk, tv)
endmethod
method begin takes nothing returns nothing
set .it = .ef
endmethod
method next takes nothing returns nothing
set .it = integer2i_e_r[.it]
endmethod
method getIterKey takes nothing returns $TYPE1$
return $TYPE1$2i_e_k[.it]
endmethod
method getIterValue takes nothing returns $TYPE2$
return $TYPE2$s_e_v[.it]
endmethod
method iterEnd takes nothing returns boolean
return .it == 0
endmethod
private method onDestroy takes nothing returns nothing
local integer x
local integer it = .ef
loop
exitwhen it == 0
set x = $TYPE1$2i($TYPE1$2i_e_k[it])+this
set x = $TYPE1$2i_CX(x-(x/8190)*8190)+1
if (integer2i_c[x] == it) then
set integer2i_c[x] = integer2i_e_u[it]
else
set integer2i_e_u[integer2i_e_d[it]] = integer2i_e_u[it]
endif
set integer2i_e_d[integer2i_e_u[it]] = integer2i_e_d[it]
set integer2i_e_ids[integer2i_e_n] = it
set integer2i_e_n = integer2i_e_n+1
set .ns = .ns-1
set it = integer2i_e_r[it]
endloop
endmethod
endstruct
endlibrary
//! endtextmacro</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>