Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / RBTREE / Inicializace a makra

Zdrojový kód: INCLUDE\UTIL\RBTREE.INC, UTIL\RBTREE.ASM


Inicializace a makra


; ------------- Macro - initialized red-black tree root

%macro		RBTREE	0

		LISTHEAD		; list of entries
		db	RB_BLACK	; color of node
		db	RB_ROOT		; flags
		dw	0		; data WORD
		dd	0		; pointer to first node (0=none)
		dd	0		; number of nodes
%endmacro

; ------------- Macro - initialized red-black tree node

%macro		RBTREENODE 0

		LISTHEAD		; list of entries
		db	RB_RED		; color of node
		db	0		; flags
		dw	0		; data WORD
		dd	0		; parent node (NULL=root)
		dd	0		; left node (NULL=none)
		dd	0		; right node (NULL=none)
%endmacro

; ------------- Macro - set color of node to red (%1 = pointer to node)

%macro		SETRED	1
		mov	byte [%1+RB_Color],RB_RED
%endmacro

; ------------- Macro - set color of node to black (%1 = pointer to node)

%macro		SETBLK	1
		mov	byte [%1+RB_Color],RB_BLACK
%endmacro

; ------------- Macro - test color for red, ZY=is red (%1 = pointer to node)

%macro		CMPRED	1
		cmp	byte [%1+RB_Color],RB_RED
%endmacro

; ------------- Macro - test color for black, ZY=is black (%1=pointer to node)

%macro		CMPBLK	1
		cmp	byte [%1+RB_Color],RB_BLACK
%endmacro

; -----------------------------------------------------------------------------
;                   Initialize red-black balanced tree root
; -----------------------------------------------------------------------------
; INPUT:	EDX = pointer to root (RBROOT)
; -----------------------------------------------------------------------------

RBTreeInit:	LISTINIT edx		; initialize list of entries
		mov	dword [edx+RB_ColorFlags],RB_BLACK+(RB_ROOT<<8)
		and	dword [edx+RBR_Node],byte 0 ; no first node
		and	dword [edx+RBR_Count],byte 0 ; no entry
		ret

Makro RBTREE slouží k deklaraci inicializovaného prázdného stromu. Na začátku obsahuje inicializovaný prázdný seznam LIST. Za ním následuje bajt s barvou (kořen má černou barvu) a bajt s příznaky (je nastaven příznak RB_ROOT označující kořen stromu). Data RB_DataW nejsou využita a jsou vynulována. Strom neobsahuje žádný uzel, ukazatel na výchozí uzel je tedy nulový a položka počtu uzlů ve stromu je také nulová.

Makro RBTREENODE slouží k deklaraci inicializovaného uzlu stromu. Na začátku obsahuje inicializovaný prázdný seznam LIST. Za ním následuje bajt s barvou (přednastavena červená barva) a bajt s příznaky (není nastaven příznak RB_ROOT, jedná se o uzel). Data RB_DataW nejsou využita a jsou vynulována. Ukazatel RBN_Parent je vynulovaný jako neplatný. Není připojen žádný další uzel, položky RBN_Left a RBN_Right jsou proto také nulové.

Makro SETRED nastaví červenou barvu uzlu. Makro SETBLK nastaví černou barvu. Makro CMPRED testuje, zda má uzel červenou barvu. Pokud ano, nastaví se příznak ZF (tj. stav ZY). Makro CMPBLK testuje, zda má uzel černou barvu. Pokud ano, nastaví se příznak ZF (tj. stav ZY). Parametrem všech uvedených čtyř maker je ukazatel na uzel.

Funkce RBTreeInit inicializuje kořen RB-stromu, jehož ukazatel je funkci předán v registru EDX. Nejdříve se inicializuje seznam položek na prázdný seznam. Jednou instrukcí se nastaví současně barva (kořen má černou barvu, RB_BLACK), příznaky (kořen má nastaven příznak RB_ROOT) a vynuluje se položka dat RB_DataW. Další dvě instrukce vynulují ukazatel na první položku stromu a čítač uzlů ve stromu.


Obsah / Utility / RBTREE / Inicializace a makra