X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Flib%2Fintrusivelist.qh;h=279210fb1808040aae9479d827fc43e5a3135ce4;hp=4fa49d3f3bfef7bc41035a9bb56e35cf1db755a4;hb=45d8904a100765555e622598a39967963733df1d;hpb=cd60b2d7d720d0ccc580eecd3abf2a4768092aba diff --git a/qcsrc/lib/intrusivelist.qh b/qcsrc/lib/intrusivelist.qh index 4fa49d3f3..279210fb1 100644 --- a/qcsrc/lib/intrusivelist.qh +++ b/qcsrc/lib/intrusivelist.qh @@ -4,8 +4,11 @@ const int IL_MAX = 128; +ERASEABLE void IL_INIT(entity this); +ERASEABLE void IL_DTOR(entity this); +ERASEABLE void IL_ENDFRAME(); /** @@ -37,6 +40,7 @@ ENDCLASS(IntrusiveList) #define IL_LAST(this) (this.il_tail) #define IL_PEEK(this) (this.il_tail) +ERASEABLE bool IL_CONTAINS(IntrusiveList this, entity it) { assert(this, return false); @@ -46,6 +50,7 @@ bool IL_CONTAINS(IntrusiveList this, entity it) /** * Push to tail */ +ERASEABLE entity IL_PUSH(IntrusiveList this, entity it) { assert(this, return NULL); @@ -64,6 +69,7 @@ entity IL_PUSH(IntrusiveList this, entity it) /** * Push to head */ +ERASEABLE entity IL_UNSHIFT(IntrusiveList this, entity it) { assert(this, return NULL); @@ -82,6 +88,7 @@ entity IL_UNSHIFT(IntrusiveList this, entity it) /** * Pop from tail */ +ERASEABLE entity IL_POP(IntrusiveList this) { assert(this, return NULL); @@ -99,6 +106,7 @@ entity IL_POP(IntrusiveList this) /** * Pop from head */ +ERASEABLE entity IL_SHIFT(IntrusiveList this) { assert(this, return NULL); @@ -116,6 +124,7 @@ entity IL_SHIFT(IntrusiveList this) /** * Remove any element, anywhere in the list */ +ERASEABLE void IL_REMOVE(IntrusiveList this, entity it) { assert(this, return); @@ -137,27 +146,24 @@ void IL_REMOVE(IntrusiveList this, entity it) */ #define IL_CLEAR(this) \ MACRO_BEGIN \ - { \ IntrusiveList __il = this; \ assert(__il); \ .entity il_prev = __il.il_prevfld; \ IL_EACH(__il, true, it.(il_next) = it.(il_prev) = NULL); \ __il.il_head = __il.il_tail = NULL; \ - } MACRO_END + MACRO_END /** * Delete the list */ #define IL_DELETE(this) \ MACRO_BEGIN \ - { \ delete(this); \ this = NULL; \ - } MACRO_END + MACRO_END #define IL_EACH(this, cond, body) \ MACRO_BEGIN \ - { \ IntrusiveList _il = this; \ assert(_il); \ .entity il_next = _il.il_nextfld; \ @@ -168,7 +174,7 @@ void IL_REMOVE(IntrusiveList this, entity it) _next = it.(il_next); \ if (cond) { LAMBDA(body) } \ } \ - } MACRO_END + MACRO_END .int il_id; IntrusiveList il_links[IL_MAX]; @@ -180,6 +186,7 @@ int il_links_ptr; #define IL_LISTS_PER_BIT IL_CEIL(IL_MAX / (3 * 24)) +ERASEABLE void IL_INIT(IntrusiveList this) { .entity nextfld, prevfld; @@ -205,15 +212,17 @@ void IL_INIT(IntrusiveList this) return; } } - LOG_WARNF("IntrusiveList overflow"); + LOG_WARN("IntrusiveList overflow"); } +ERASEABLE void IL_DTOR(IntrusiveList this) { IL_CLEAR(this); il_links[this.il_id] = NULL; } +ERASEABLE void IL_ENDFRAME() { #if 0 @@ -233,6 +242,7 @@ void IL_ENDFRAME() #endif } +ERASEABLE void ONREMOVE(entity this) { if (this.il_lists) {