library Event2
globals
private real eventv = 0
private integer count = 0
private trigger array trig
endglobals
function CreateEvent takes nothing returns integer
set count = count + 1
set trig[count] = CreateTrigger()
return count
endfunction
function TriggerRegisterEvent takes trigger t, integer ev returns nothing
call TriggerRegisterVariableEvent(t, SCOPE_PRIVATE + "eventv", EQUAL, ev)
endfunction
function CodeRegisterEvent takes boolexpr c, integer ev returns nothing
call TriggerAddCondition(trig[ev], c)
endfunction
function FireEvent takes integer ev returns nothing
set eventv = 0
set eventv = ev
endfunction
endlibrary
library Event
private keyword destroyNode
struct EventReg extends array
integer data
method clear takes nothing returns nothing
set this.data=0
endmethod
method destroy takes nothing returns nothing
call Event(this).destroyNode()
endmethod
endstruct
private module Stack
static thistype top=0
static method increment takes nothing returns nothing
set thistype.top=thistype(thistype.top+1)
endmethod
static method decrement takes nothing returns nothing
set thistype.top=thistype(thistype.top-1)
endmethod
endmodule
private struct EventStack extends array
implement Stack
Event current
endstruct
struct Event
private trigger trig
private thistype next
private thistype prev
static method getTriggeringEventReg takes nothing returns EventReg
return EventStack.top.current
endmethod
static method create takes nothing returns Event
local Event this=Event.allocate()
set this.next=this
set this.prev=this
return this
endmethod
private static trigger currentTrigger
method fire takes nothing returns nothing
local thistype curr=this.next
call EventStack.increment()
loop
exitwhen curr==this
set thistype.currentTrigger=curr.trig
if IsTriggerEnabled(thistype.currentTrigger) then
set EventStack.top.current=curr
if TriggerEvaluate(thistype.currentTrigger) then
call TriggerExecute(thistype.currentTrigger)
endif
else
call EnableTrigger(thistype.currentTrigger)
if IsTriggerEnabled(thistype.currentTrigger) then
call DisableTrigger(thistype.currentTrigger)
else
set curr.next.prev=curr.prev
set curr.prev.next=curr.next
call curr.deallocate()
endif
endif
set curr=curr.next
endloop
call EventStack.decrement()
endmethod
method register takes trigger t returns EventReg
local Event new=Event.allocate()
set new.prev=this.prev
set this.prev.next=new
set this.prev=new
set new.next=this
set new.trig=t
call EventReg(new).clear()
return new
endmethod
method destroyNode takes nothing returns nothing // called on EventReg
set this.prev.next=this.next
set this.next.prev=this.prev
call this.deallocate()
endmethod
method unregister takes trigger t returns nothing
local thistype curr=this.next
loop
exitwhen curr==this
if curr.trig==t then
set curr.next.prev=curr.prev
set curr.prev.next=curr.next
call curr.deallocate()
return
endif
set curr=curr.next
endloop
endmethod
method destroy takes nothing returns nothing
local thistype curr=this.next
loop
call curr.deallocate()
exitwhen curr==this
set curr=curr.next
endloop
endmethod
method chainDestroy takes nothing returns nothing
call this.destroy() // backwards compatability.
endmethod
endstruct
endlibrary
library Benchmark initializer OnInit uses Event, Event2
native StopWatchCreate takes nothing returns integer
native StopWatchMark takes integer stopwatch returns real
native StopWatchDestroy takes integer stopwatch returns nothing
globals
Event e
integer ev
endglobals
private function btest takes nothing returns boolean
return true
endfunction
private function ctest takes nothing returns nothing
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
set e = Event.create()
set ev = CreateEvent()
call TriggerRegisterEvent(t, ev)
call e.register(t)
call TriggerAddCondition(t, Condition(function btest))
call TriggerAddAction(t, function ctest)
endfunction
globals
private constant string TITLE_A="Event by Nestharus"
//! textmacro Benchmark__TestA
call FireEvent(ev)
//! endtextmacro
private constant string TITLE_B="Event by jesus4lyf"
//! textmacro Benchmark__TestB
call e.fire()
//! endtextmacro
endglobals
private function TestA1000 takes nothing returns nothing
local integer i=100 // hence 1,000 execs
loop
exitwhen i==0
set i=i-1
//! runtextmacro Benchmark__TestA() // 1
//! runtextmacro Benchmark__TestA() // 2
//! runtextmacro Benchmark__TestA() // 3
//! runtextmacro Benchmark__TestA() // 4
//! runtextmacro Benchmark__TestA() // 5
//! runtextmacro Benchmark__TestA() // 6
//! runtextmacro Benchmark__TestA() // 7
//! runtextmacro Benchmark__TestA() // 8
//! runtextmacro Benchmark__TestA() // 9
//! runtextmacro Benchmark__TestA() // 10
endloop
endfunction
private function TestB1000 takes nothing returns nothing
local integer i=100
loop
exitwhen i==0 // hence 1,000 execs
set i=i-1
//! runtextmacro Benchmark__TestB() // 1
//! runtextmacro Benchmark__TestB() // 2
//! runtextmacro Benchmark__TestB() // 3
//! runtextmacro Benchmark__TestB() // 4
//! runtextmacro Benchmark__TestB() // 5
//! runtextmacro Benchmark__TestB() // 6
//! runtextmacro Benchmark__TestB() // 7
//! runtextmacro Benchmark__TestB() // 8
//! runtextmacro Benchmark__TestB() // 9
//! runtextmacro Benchmark__TestB() // 10
endloop
endfunction
private function OnEsc takes nothing returns nothing
local integer sw
local integer i
set i=0
set sw=StopWatchCreate()
loop
set i=i+1
call TestA1000.evaluate() // x10 - 10,000 executions altogether.
exitwhen i==10
endloop
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 1000, R2SW(StopWatchMark(sw), 100, 16))
call StopWatchDestroy(sw)
set i=0
set sw=StopWatchCreate()
loop
set i=i+1
call TestB1000.evaluate() // x10 - 10,000 executions altogether.
exitwhen i==10
endloop
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 1000, R2SW(StopWatchMark(sw), 100, 16))
call StopWatchDestroy(sw)
endfunction
private function OnInit takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerRegisterPlayerEvent(t,Player(0),EVENT_PLAYER_END_CINEMATIC)
call TriggerAddAction(t,function OnEsc)
call Init()
endfunction
endlibrary