Trigger

Scripts

14 years
edited 8 years
Code (jass) Select
1
library Trigger /* v1.1.0.2
2
************************************************************************************
3
*
4
*   */ uses /*
5
*   
6
*       */ ErrorMessage         /*
7
*       */ BooleanExpression    /*
8
*       */ NxListT              /*
9
*		*/ UniqueNxListT		/*
10
*       */ Init                 /*
11
*		*/ AllocT				/*
12
*
13
************************************************************************************
14
*
15
*   struct Trigger extends array
16
*           
17
*       Fields
18
*       -------------------------
19
*
20
*           readonly trigger trigger
21
*               -   use to register events, nothing else
22
*               -   keep in mind that triggers referencing this trigger won't fire when events fire
23
*               -   this trigger will fire when triggers referencing this trigger are fired
24
*
25
*           boolean enabled
26
*
27
*       Methods
28
*       -------------------------
29
*
30
*           static method create takes boolean reversed returns Trigger
31
*				-	when reverse is true, the entire expression is run in reverse
32
*
33
*           method destroy takes nothing returns nothing
34
*
35
*           method register takes boolexpr expression returns TriggerCondition
36
*
37
*           method reference takes Trigger trig returns TriggerReference
38
*               -   like register, but for triggers instead
39
*
40
*           method fire takes nothing returns nothing
41
*
42
*           method clear takes nothing returns nothing
43
*               -   clears expressions
44
*           method clearReferences takes nothing returns nothing
45
*               -   clears trigger references
46
*           method clearBackReferences takes nothing returns nothing
47
*               -   removes references for all triggers referencing this trigger
48
*           method clearEvents takes nothing returns nothing
49
*               -   clears events
50
*
51
*           debug static method calculateMemoryUsage takes nothing returns integer
52
*           debug static method getAllocatedMemoryAsString takes nothing returns string
53
*
54
************************************************************************************
55
*
56
*   struct TriggerReference extends array
57
*           
58
*       Methods
59
*       -------------------------
60
*
61
*           method destroy takes nothing returns nothing
62
*
63
*           method replace takes Trigger trigger returns nothing
64
*
65
************************************************************************************
66
*
67
*   struct TriggerCondition extends array
68
*
69
*       Methods
70
*       -------------------------
71
*
72
*           method destroy takes nothing returns nothing
73
*
74
*           method replace takes boolexpr expr returns nothing
75
*
76
************************************************************************************/
77
    private struct TriggerMemory extends array
78
        //! runtextmacro CREATE_TABLE_FIELD("public", "trigger", "trig", "trigger")
79
        //! runtextmacro CREATE_TABLE_FIELD("public", "triggercondition", "tc", "triggercondition")
80
        
81
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "expression", "BooleanExpression")                 //the trigger's expression
82
        
83
        //! runtextmacro CREATE_TABLE_FIELD("public", "boolean", "enabled", "boolean")
84
        
85
        method updateTrigger takes nothing returns nothing
86
            if (tc != null) then
87
                call TriggerRemoveCondition(trig, tc)
88
            endif
89
        
90
            if (enabled and expression.expression != null) then
91
                set tc = TriggerAddCondition(trig, expression.expression)
92
            else
93
				call tc_clear()
94
            endif
95
        endmethod
96
        
97
        private static method init takes nothing returns nothing
98
            //! runtextmacro INITIALIZE_TABLE_FIELD("trig")
99
            //! runtextmacro INITIALIZE_TABLE_FIELD("tc")
100
            
101
            //! runtextmacro INITIALIZE_TABLE_FIELD("expression")
102
            
103
            //! runtextmacro INITIALIZE_TABLE_FIELD("enabled")
104
        endmethod
105
        
106
        implement Init
107
    endstruct
108
109
    private struct TriggerAllocator extends array
110
        implement AllocT
111
    endstruct
112
    
113
    private keyword TriggerReferencedList
114
    
115
    private struct TriggerReferenceListData extends array
116
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "trig", "TriggerMemory")           //the referenced trigger
117
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "ref", "TriggerReferencedList")    //the TriggerReferencedList data for that trigger (relationship in 2 places)
118
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "expr", "BooleanExpression")
119
    
120
        implement NxListT
121
        
122
        private static method init takes nothing returns nothing
123
            //! runtextmacro INITIALIZE_TABLE_FIELD("trig")
124
            //! runtextmacro INITIALIZE_TABLE_FIELD("ref")
125
            //! runtextmacro INITIALIZE_TABLE_FIELD("expr")
126
        endmethod
127
        
128
        implement Init
129
    endstruct
130
131
    /*
132
    *   List of triggers referencing current trigger
133
    */
134
    private struct TriggerReferencedList extends array
135
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "trig", "TriggerMemory")               //the trigger referencing this trigger
136
        //! runtextmacro CREATE_TABLE_FIELD("public", "integer", "ref", "TriggerReferenceListData")     //the ref 
137
    
138
        implement NxListT
139
        
140
        method updateExpression takes nothing returns nothing
141
            local thistype node
142
            local boolexpr expr
143
            
144
            /*
145
            *   Retrieve the expression of the referenced trigger
146
            */
147
            if (TriggerMemory(this).enabled) then
148
                set expr = TriggerMemory(this).expression.expression
149
            else
150
                set expr = null
151
            endif
152
            
153
            /*
154
            *   Iterate over all triggers referencing this trigger
155
            */
156
            set node = first
157
            loop
158
                exitwhen node == 0
159
                
160
                /*
161
                *   Replace expression and then update the target trigger
162
                */
163
                call node.ref.expr.replace(expr)
164
                call node.trig.updateTrigger()
165
                call TriggerReferencedList(node.trig).updateExpression()
166
                
167
                set node = node.next
168
            endloop
169
            
170
            set expr = null
171
        endmethod
172
        
173
        method purge takes nothing returns nothing
174
            local thistype node = first
175
            
176
            loop
177
                exitwhen node == 0
178
                
179
                /*
180
                *   Unregister the expression from the referencing trigger
181
                *   Update that trigger
182
                */
183
                call node.ref.expr.unregister()
184
                call node.trig.updateTrigger()
185
                call node.ref.remove()
186
                call TriggerReferencedList(node.trig).updateExpression()
187
                
188
                set node = node.next
189
            endloop
190
            
191
            call destroy()
192
        endmethod
193
        
194
        method clearReferences takes nothing returns nothing
195
            local thistype node = first
196
            
197
            loop
198
                exitwhen node == 0
199
                
200
                /*
201
                *   Unregister the expression from the referencing trigger
202
                *   Update that trigger
203
                */
204
                call node.ref.expr.unregister()
205
                call node.trig.updateTrigger()
206
                call node.ref.remove()
207
                call TriggerReferencedList(node.trig).updateExpression()
208
                
209
                set node = node.next
210
            endloop
211
            
212
            call clear()
213
        endmethod
214
        
215
        private static method init takes nothing returns nothing
216
            //! runtextmacro INITIALIZE_TABLE_FIELD("trig")
217
            //! runtextmacro INITIALIZE_TABLE_FIELD("ref")
218
        endmethod
219
        
220
        implement Init
221
    endstruct
222
    
223
    /*
224
    *   List of triggers current trigger references
225
    */
226
    private struct TriggerReferenceList extends array
227
        method add takes TriggerReferencedList trig returns thistype
228
            local TriggerReferenceListData node = TriggerReferenceListData(this).enqueue()
229
            
230
            /*
231
            *   Register the trigger as a reference
232
            */
233
            set node.trig = trig
234
            set node.ref = TriggerReferencedList(trig).enqueue()
235
            set node.ref.trig = this
236
            set node.ref.ref = node
237
            
238
            /*
239
            *   Add the reference's expression
240
            *
241
            *   Add even if null to ensure correct order
242
            */
243
            if (TriggerMemory(trig).enabled) then
244
                set node.expr = TriggerMemory(this).expression.register(TriggerMemory(trig).expression.expression)
245
            else
246
				set node.expr = TriggerMemory(this).expression.register(null)
247
            endif
248
            
249
            call TriggerMemory(this).updateTrigger()
250
            
251
            /*
252
            *   Update the expressions of triggers referencing this trigger
253
            */
254
            call TriggerReferencedList(this).updateExpression()
255
            
256
            /*
257
            *   Return the reference
258
            */
259
            return node
260
        endmethod
261
        
262
        method erase takes nothing returns nothing
263
            local TriggerReferenceListData node = this          //the node
264
            set this = node.ref.trig                            //this trigger        
265
            
266
            call node.expr.unregister()
267
            call TriggerMemory(this).updateTrigger()
268
            call TriggerReferencedList(this).updateExpression()
269
            
270
            call node.ref.remove()
271
            call node.remove()
272
        endmethod
273
        
274
        method replace takes TriggerMemory trig returns nothing
275
            local TriggerReferenceListData node = this
276
            set this = node.list
277
            
278
            call node.ref.remove()
279
            
280
            set node.trig = trig
281
            set node.ref = TriggerReferencedList(trig).enqueue()
282
            set node.ref.trig = this
283
            set node.ref.ref = node
284
            
285
            if (trig.enabled) then
286
                call node.expr.replace(trig.expression.expression)
287
            else
288
                call node.expr.replace(null)
289
            endif
290
            
291
            call TriggerMemory(this).updateTrigger()
292
            
293
            call TriggerReferencedList(this).updateExpression()
294
        endmethod
295
        
296
        /*
297
        *   Purges all references
298
        */
299
        method purge takes nothing returns nothing
300
            local TriggerReferenceListData node = TriggerReferenceListData(this).first
301
            
302
            loop
303
                exitwhen node == 0
304
                
305
                /*
306
                *   Removes the reference from the referenced list
307
                *   (triggers no longer referenced by this)
308
                */
309
                call node.ref.remove()
310
                
311
                set node = node.next
312
            endloop
313
            
314
            /*
315
            *   Destroy all references by triggers referencing this
316
            */
317
            call TriggerReferencedList(this).purge()
318
            
319
            call TriggerReferenceListData(this).destroy()
320
        endmethod
321
        
322
        method clearReferences takes nothing returns nothing
323
            local TriggerReferenceListData node = TriggerReferenceListData(this).first
324
            
325
            loop
326
                exitwhen node == 0
327
                
328
                /*
329
                *   Removes the reference from the referenced list
330
                *   (triggers no longer referenced by this)
331
                */
332
                call node.ref.remove()
333
				
334
				/*
335
				*	unregisters code
336
				*/
337
				call node.expr.unregister()
338
                
339
                set node = node.next
340
            endloop
341
            
342
            call TriggerReferenceListData(this).clear()
343
        endmethod
344
    endstruct
345
    
346
    private struct TriggerReferenceData extends array
347
        static if DEBUG_MODE then
348
            //! runtextmacro CREATE_TABLE_FIELD("private", "boolean", "isTriggerReference", "boolean")
349
        endif
350
        
351
        static method create takes TriggerReferenceList origin, TriggerMemory ref returns thistype
352
            local thistype this = origin.add(ref)
353
            
354
            debug set isTriggerReference = true
355
            
356
            return this
357
        endmethod
358
        
359
        method destroy takes nothing returns nothing
360
            debug call ThrowError(this == 0,                "Trigger", "destroy", "TriggerReferenceData", this, "Attempted To Destroy Null TriggerReferenceData.")
361
            debug call ThrowError(not isTriggerReference,   "Trigger", "destroy", "TriggerReferenceData", this, "Attempted To Destroy Invalid TriggerReferenceData.")
362
            
363
            debug set isTriggerReference = false
364
            
365
            call TriggerReferenceList(this).erase()
366
        endmethod
367
        
368
        method replace takes Trigger trig returns nothing
369
            debug call ThrowError(this == 0,                "Trigger", "destroy", "TriggerReferenceData", this, "Attempted To Destroy Null TriggerReferenceData.")
370
            debug call ThrowError(not isTriggerReference,   "Trigger", "destroy", "TriggerReferenceData", this, "Attempted To Destroy Invalid TriggerReferenceData.")
371
            
372
            call TriggerReferenceList(this).replace(trig)
373
        endmethod
374
        
375
        private static method init takes nothing returns nothing
376
            static if DEBUG_MODE then
377
                //! runtextmacro INITIALIZE_TABLE_FIELD("isTriggerReference")
378
            endif
379
        endmethod
380
        
381
        implement Init
382
    endstruct
383
    
384
	private struct TriggerConditionDataCollection extends array
385
		implement UniqueNxListT
386
	endstruct
387
	
388
    private struct TriggerConditionData extends array
389
        static if DEBUG_MODE then
390
            //! runtextmacro CREATE_TABLE_FIELD("private", "boolean", "isCondition", "boolean")
391
        endif
392
        
393
        //! runtextmacro CREATE_TABLE_FIELD("private", "integer", "trig", "TriggerMemory")
394
        
395
        private static method updateTrigger takes TriggerMemory trig returns nothing
396
            call trig.updateTrigger()
397
            call TriggerReferencedList(trig).updateExpression()
398
        endmethod
399
    
400
        static method create takes TriggerMemory trig, boolexpr expression returns thistype
401
            local thistype this = trig.expression.register(expression)
402
            
403
            set this.trig = trig
404
            
405
            debug set isCondition = true
406
			
407
			call TriggerConditionDataCollection(trig).enqueue(this)
408
            
409
            call updateTrigger(trig)
410
            
411
            return this
412
        endmethod
413
        
414
        method destroy takes nothing returns nothing
415
            debug call ThrowError(this == 0,        "Trigger", "destroy", "TriggerConditionData", this, "Attempted To Destroy Null TriggerConditionData.")
416
            debug call ThrowError(not isCondition,  "Trigger", "destroy", "TriggerConditionData", this, "Attempted To Destroy Invalid TriggerConditionData.")
417
            
418
            call BooleanExpression(this).unregister()
419
			
420
			call TriggerConditionDataCollection(this).remove()
421
            
422
            debug set isCondition = false
423
            
424
            /*
425
            *   Update the expression
426
            */
427
            call updateTrigger(trig)
428
        endmethod
429
        
430
        method replace takes boolexpr expr returns nothing
431
            debug call ThrowError(this == 0,        "Trigger", "destroy", "TriggerConditionData", this, "Attempted To Destroy Null TriggerConditionData.")
432
            debug call ThrowError(not isCondition,  "Trigger", "destroy", "TriggerConditionData", this, "Attempted To Destroy Invalid TriggerConditionData.")
433
            
434
            call BooleanExpression(this).replace(expr)
435
            
436
            call updateTrigger(trig)
437
        endmethod
438
		
439
        private static method init takes nothing returns nothing
440
            static if DEBUG_MODE then
441
                //! runtextmacro INITIALIZE_TABLE_FIELD("isCondition")
442
            endif
443
            
444
            //! runtextmacro INITIALIZE_TABLE_FIELD("trig")
445
        endmethod
446
        
447
        implement Init
448
    endstruct
449
    
450
    struct TriggerReference extends array
451
        method destroy takes nothing returns nothing
452
            call TriggerReferenceData(this).destroy()
453
        endmethod
454
        method replace takes Trigger trig returns nothing
455
            call TriggerReferenceData(this).replace(trig)
456
        endmethod
457
    endstruct
458
    
459
    struct TriggerCondition extends array
460
        method destroy takes nothing returns nothing
461
            call TriggerConditionData(this).destroy()
462
        endmethod
463
        method replace takes boolexpr expr returns nothing
464
            call TriggerConditionData(this).replace(expr)
465
        endmethod
466
    endstruct
467
    
468
    struct Trigger extends array
469
        static if DEBUG_MODE then
470
            //! runtextmacro CREATE_TABLE_FIELD("private", "boolean", "isTrigger", "boolean")
471
        endif
472
    
473
        static method create takes boolean reversed returns thistype
474
            local thistype this = TriggerAllocator.allocate()
475
            
476
            debug set isTrigger = true
477
            
478
            set TriggerMemory(this).enabled = true
479
            
480
            call TriggerReferencedList(this).clear()
481
            call TriggerReferenceListData(this).clear()
482
			call TriggerConditionDataCollection(this).clear()
483
            
484
            set TriggerMemory(this).expression = BooleanExpression.create(reversed)
485
            
486
            set TriggerMemory(this).trig = CreateTrigger()
487
            
488
            return this
489
        endmethod
490
		
491
		static if DEBUG_MODE then
492
			method destroy takes nothing returns nothing
493
				call destroy_p()
494
			endmethod
495
		
496
			private method destroy_p takes nothing returns nothing
497
				debug call ThrowError(this == 0,        "Trigger", "destroy", "Trigger", this, "Attempted To Destroy Null Trigger.")
498
				debug call ThrowError(not isTrigger,    "Trigger", "destroy", "Trigger", this, "Attempted To Destroy Invalid Trigger.")
499
				
500
				debug set isTrigger = false
501
			
502
				call TriggerReferenceList(this).purge()
503
				call TriggerConditionDataCollection(this).destroy()
504
				
505
				if (TriggerMemory(this).tc != null) then
506
					call TriggerRemoveCondition(TriggerMemory(this).trig, TriggerMemory(this).tc)
507
				endif
508
				call TriggerMemory(this).tc_clear()
509
				call DestroyTrigger(TriggerMemory(this).trig)
510
				call TriggerMemory(this).trig_clear()
511
				
512
				call TriggerMemory(this).expression.destroy()
513
				
514
				call TriggerAllocator(this).deallocate()
515
			endmethod
516
		else
517
			method destroy takes nothing returns nothing
518
				debug call ThrowError(this == 0,        "Trigger", "destroy", "Trigger", this, "Attempted To Destroy Null Trigger.")
519
				debug call ThrowError(not isTrigger,    "Trigger", "destroy", "Trigger", this, "Attempted To Destroy Invalid Trigger.")
520
				
521
				debug set isTrigger = false
522
			
523
				call TriggerReferenceList(this).purge()
524
				call TriggerConditionDataCollection(this).destroy()
525
				
526
				if (TriggerMemory(this).tc != null) then
527
					call TriggerRemoveCondition(TriggerMemory(this).trig, TriggerMemory(this).tc)
528
				endif
529
				call TriggerMemory(this).tc_clear()
530
				call DestroyTrigger(TriggerMemory(this).trig)
531
				call TriggerMemory(this).trig_clear()
532
				
533
				call TriggerMemory(this).expression.destroy()
534
				
535
				call TriggerAllocator(this).deallocate()
536
			endmethod
537
		endif
538
539
		static if DEBUG_MODE then
540
			method register takes boolexpr expression returns TriggerCondition
541
				return register_p(expression)
542
			endmethod
543
			private method register_p takes boolexpr expression returns TriggerCondition
544
				debug call ThrowError(this == 0,            "Trigger", "register", "Trigger", this, "Attempted To Register To Null Trigger.")
545
				debug call ThrowError(not isTrigger,        "Trigger", "register", "Trigger", this, "Attempted To Register To Invalid Trigger.")
546
			
547
				/*
548
				*   Register the expression
549
				*/
550
				return TriggerConditionData.create(this, expression)
551
			endmethod
552
		else
553
			method register takes boolexpr expression returns TriggerCondition
554
				debug call ThrowError(this == 0,            "Trigger", "register", "Trigger", this, "Attempted To Register To Null Trigger.")
555
				debug call ThrowError(not isTrigger,        "Trigger", "register", "Trigger", this, "Attempted To Register To Invalid Trigger.")
556
			
557
				/*
558
				*   Register the expression
559
				*/
560
				return TriggerConditionData.create(this, expression)
561
			endmethod
562
		endif
563
        
564
		static if DEBUG_MODE then
565
			method clear takes nothing returns nothing
566
				call clear_p()
567
			endmethod
568
			private method clear_p takes nothing returns nothing
569
				local TriggerConditionDataCollection node = TriggerConditionDataCollection(this).first
570
			
571
				debug call ThrowError(this == 0,        "Trigger", "clear", "Trigger", this, "Attempted To Clear Null Trigger.")
572
				debug call ThrowError(not isTrigger,    "Trigger", "clear", "Trigger", this, "Attempted To Clear Invalid Trigger.")
573
				
574
				loop
575
					exitwhen node == 0
576
					
577
					call BooleanExpression(node).unregister()
578
					
579
					set node = node.next
580
				endloop
581
				
582
				call TriggerConditionDataCollection(this).clear()
583
				
584
				call TriggerMemory(this).updateTrigger()
585
				call TriggerReferencedList(this).updateExpression()
586
			endmethod
587
		else
588
			method clear takes nothing returns nothing
589
				local TriggerConditionDataCollection node = TriggerConditionDataCollection(this).first
590
			
591
				debug call ThrowError(this == 0,        "Trigger", "clear", "Trigger", this, "Attempted To Clear Null Trigger.")
592
				debug call ThrowError(not isTrigger,    "Trigger", "clear", "Trigger", this, "Attempted To Clear Invalid Trigger.")
593
				
594
				loop
595
					exitwhen node == 0
596
					
597
					call BooleanExpression(node).unregister()
598
					
599
					set node = node.next
600
				endloop
601
				
602
				call TriggerConditionDataCollection(this).clear()
603
				
604
				call TriggerMemory(this).updateTrigger()
605
				call TriggerReferencedList(this).updateExpression()
606
			endmethod
607
		endif
608
		
609
		static if DEBUG_MODE then
610
			method clearReferences takes nothing returns nothing
611
				call clearReferences_p()
612
			endmethod
613
			private method clearReferences_p takes nothing returns nothing
614
				debug call ThrowError(this == 0,        "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear References Of Null Trigger.")
615
				debug call ThrowError(not isTrigger,    "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear References Of Invalid Trigger.")
616
				
617
				call TriggerReferenceList(this).clearReferences()
618
				
619
				call TriggerMemory(this).updateTrigger()
620
				call TriggerReferencedList(this).updateExpression()
621
			endmethod
622
		else
623
			method clearReferences takes nothing returns nothing
624
				debug call ThrowError(this == 0,        "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear References Of Null Trigger.")
625
				debug call ThrowError(not isTrigger,    "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear References Of Invalid Trigger.")
626
				
627
				call TriggerReferenceList(this).clearReferences()
628
				
629
				call TriggerMemory(this).updateTrigger()
630
				call TriggerReferencedList(this).updateExpression()
631
			endmethod
632
		endif
633
        
634
		static if DEBUG_MODE then
635
			method clearBackReferences takes nothing returns nothing
636
				call clearBackReferences_p()
637
			endmethod
638
			
639
			private method clearBackReferences_p takes nothing returns nothing
640
				debug call ThrowError(this == 0,        "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear Back References Of Null Trigger.")
641
				debug call ThrowError(not isTrigger,    "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear Back References Of Invalid Trigger.")
642
				
643
				call TriggerReferencedList(this).clearReferences()
644
			endmethod
645
		else
646
			method clearBackReferences takes nothing returns nothing
647
				debug call ThrowError(this == 0,        "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear Back References Of Null Trigger.")
648
				debug call ThrowError(not isTrigger,    "Trigger", "clearReferences", "Trigger", this, "Attempted To Clear Back References Of Invalid Trigger.")
649
				
650
				call TriggerReferencedList(this).clearReferences()
651
			endmethod
652
		endif
653
        
654
		static if DEBUG_MODE then
655
			method reference takes thistype trig returns TriggerReference
656
				return reference_p(trig)
657
			endmethod
658
			
659
			private method reference_p takes thistype trig returns TriggerReference
660
				debug call ThrowError(this == 0,            "Trigger", "reference", "Trigger", this, "Attempted To Make Null Trigger Reference Trigger.")
661
				debug call ThrowError(not isTrigger,        "Trigger", "reference", "Trigger", this, "Attempted To Make Invalid Trigger Reference Trigger.")
662
				debug call ThrowError(trig == 0,            "Trigger", "reference", "Trigger", this, "Attempted To Reference Null Trigger (" + I2S(trig) + ").")
663
				debug call ThrowError(not trig.isTrigger,   "Trigger", "reference", "Trigger", this, "Attempted To Reference Invalid Trigger (" + I2S(trig) + ").")
664
				
665
				return TriggerReferenceData.create(this, trig)
666
			endmethod
667
		else
668
			method reference takes thistype trig returns TriggerReference
669
				debug call ThrowError(this == 0,            "Trigger", "reference", "Trigger", this, "Attempted To Make Null Trigger Reference Trigger.")
670
				debug call ThrowError(not isTrigger,        "Trigger", "reference", "Trigger", this, "Attempted To Make Invalid Trigger Reference Trigger.")
671
				debug call ThrowError(trig == 0,            "Trigger", "reference", "Trigger", this, "Attempted To Reference Null Trigger (" + I2S(trig) + ").")
672
				debug call ThrowError(not trig.isTrigger,   "Trigger", "reference", "Trigger", this, "Attempted To Reference Invalid Trigger (" + I2S(trig) + ").")
673
				
674
				return TriggerReferenceData.create(this, trig)
675
			endmethod
676
		endif
677
		
678
		static if DEBUG_MODE then
679
			method clearEvents takes nothing returns nothing
680
				call clearEvents_p()
681
			endmethod
682
			
683
			private method clearEvents_p takes nothing returns nothing
684
				debug call ThrowError(this == 0,        "Trigger", "clearEvents", "Trigger", this, "Attempted To Clear Events Of Null Trigger.")
685
				debug call ThrowError(not isTrigger,    "Trigger", "clearEvents", "Trigger", this, "Attempted To Clear Events Of Invalid Trigger.")
686
			
687
				if (TriggerMemory(this).tc != null) then
688
					call TriggerRemoveCondition(TriggerMemory(this).trig, TriggerMemory(this).tc)
689
				endif
690
				call DestroyTrigger(TriggerMemory(this).trig)
691
				
692
				set TriggerMemory(this).trig = CreateTrigger()
693
				if (TriggerMemory(this).enabled) then
694
					set TriggerMemory(this).tc = TriggerAddCondition(TriggerMemory(this).trig, TriggerMemory(this).expression.expression)
695
				else
696
					call TriggerMemory(this).tc_clear()
697
				endif
698
			endmethod
699
		else
700
			method clearEvents takes nothing returns nothing
701
				debug call ThrowError(this == 0,        "Trigger", "clearEvents", "Trigger", this, "Attempted To Clear Events Of Null Trigger.")
702
				debug call ThrowError(not isTrigger,    "Trigger", "clearEvents", "Trigger", this, "Attempted To Clear Events Of Invalid Trigger.")
703
			
704
				if (TriggerMemory(this).tc != null) then
705
					call TriggerRemoveCondition(TriggerMemory(this).trig, TriggerMemory(this).tc)
706
				endif
707
				call DestroyTrigger(TriggerMemory(this).trig)
708
				
709
				set TriggerMemory(this).trig = CreateTrigger()
710
				if (TriggerMemory(this).enabled) then
711
					set TriggerMemory(this).tc = TriggerAddCondition(TriggerMemory(this).trig, TriggerMemory(this).expression.expression)
712
				else
713
					call TriggerMemory(this).tc_clear()
714
				endif
715
			endmethod
716
		endif
717
        
718
        method fire takes nothing returns nothing
719
            debug call ThrowError(this == 0,        "Trigger", "fire", "Trigger", this, "Attempted To Fire Null Trigger.")
720
            debug call ThrowError(not isTrigger,    "Trigger", "fire", "Trigger", this, "Attempted To Fire Invalid Trigger.")
721
        
722
            call TriggerEvaluate(TriggerMemory(this).trig)
723
        endmethod
724
        
725
        method operator trigger takes nothing returns trigger
726
            debug call ThrowError(this == 0,        "Trigger", "trigger", "Trigger", this, "Attempted To Read Null Trigger.")
727
            debug call ThrowError(not isTrigger,    "Trigger", "trigger", "Trigger", this, "Attempted To Read Invalid Trigger.")
728
        
729
            return TriggerMemory(this).trig
730
        endmethod
731
        
732
        method operator enabled takes nothing returns boolean
733
            debug call ThrowError(this == 0,                                "Trigger", "enabled", "Trigger", this, "Attempted To Read Null Trigger.")
734
            debug call ThrowError(not isTrigger,                            "Trigger", "enabled", "Trigger", this, "Attempted To Read Invalid Trigger.")
735
            
736
            return TriggerMemory(this).enabled
737
        endmethod
738
		
739
		static if DEBUG_MODE then
740
			method operator enabled= takes boolean enable returns nothing
741
				set enabled_p = enable
742
			endmethod
743
			private method operator enabled_p= takes boolean enable returns nothing
744
				debug call ThrowError(this == 0,                                "Trigger", "enabled=", "Trigger", this, "Attempted To Set Null Trigger.")
745
				debug call ThrowError(not isTrigger,                            "Trigger", "enabled=", "Trigger", this, "Attempted To Set Invalid Trigger.")
746
				debug call ThrowWarning(TriggerMemory(this).enabled == enable,  "Trigger", "enabled=", "Trigger", this, "Setting Enabled To Its Value.")
747
			
748
				set TriggerMemory(this).enabled = enable
749
				
750
				call TriggerMemory(this).updateTrigger()
751
				call TriggerReferencedList(this).updateExpression()
752
			endmethod
753
		else
754
			method operator enabled= takes boolean enable returns nothing
755
				debug call ThrowError(this == 0,                                "Trigger", "enabled=", "Trigger", this, "Attempted To Set Null Trigger.")
756
				debug call ThrowError(not isTrigger,                            "Trigger", "enabled=", "Trigger", this, "Attempted To Set Invalid Trigger.")
757
				debug call ThrowWarning(TriggerMemory(this).enabled == enable,  "Trigger", "enabled=", "Trigger", this, "Setting Enabled To Its Value.")
758
			
759
				set TriggerMemory(this).enabled = enable
760
				
761
				call TriggerMemory(this).updateTrigger()
762
				call TriggerReferencedList(this).updateExpression()
763
			endmethod
764
		endif
765
        
766
        static if DEBUG_MODE then
767
            static method calculateMemoryUsage takes nothing returns integer
768
                return /*
769
				*/	TriggerAllocator.calculateMemoryUsage() + /*
770
				*/	TriggerConditionDataCollection.calculateMemoryUsage() + /*
771
				*/	TriggerReferenceListData.calculateMemoryUsage() + /*
772
				*/	TriggerReferencedList.calculateMemoryUsage() + /*
773
				*/	BooleanExpression.calculateMemoryUsage()
774
            endmethod
775
            
776
            static method getAllocatedMemoryAsString takes nothing returns string
777
                return /*
778
				*/	"(Trigger)[" + TriggerAllocator.getAllocatedMemoryAsString() + "], " + /*
779
				*/	"(Trigger TriggerConditionDataCollection)[" + TriggerConditionDataCollection.getAllocatedMemoryAsString() + "], " + /*
780
				*/	"(Trigger Reference)[" + TriggerReferenceListData.getAllocatedMemoryAsString() + "], " + /*
781
				*/	"(Trigger Reference Back)[" + TriggerReferencedList.getAllocatedMemoryAsString() + "], " + /*
782
				*/	"(Boolean Expression (all))[" + BooleanExpression.getAllocatedMemoryAsString() + "]"
783
            endmethod
784
        endif
785
        
786
        private static method init takes nothing returns nothing
787
            static if DEBUG_MODE then
788
                //! runtextmacro INITIALIZE_TABLE_FIELD("isTrigger")
789
            endif
790
        endmethod
791
        
792
        implement Init
793
    endstruct
794
endlibrary