this will make a BTree of any arbitrary structured type.
PB 4.51
Thanks for the bug fixes
Code: Select all
;how you can use a macro as a class template
;creates a bTree object class of any structured type
;Template Class of a Btree
;Author Idle
;updated to PB 4.51
EnableExplicit
Macro Template_class_Btree(T)
Structure Tree#T
*vt
item.T;
key.i
*left.Tree#T;
*right.Tree#T;
EndStructure
Declare Free_Tree_#T(*this.Tree#T)
Declare Find_Tree_#T(*this.Tree#T,*item,key)
Declare Insert_Tree_#T(*this.Tree#T,*item,key)
Interface Tree_obj_#T
Insert(*item,key)
Find(*item,key)
Free()
EndInterface
Procedure Find_Tree_#T(*this.Tree#T,*item,key.i)
If Not *this
ProcedureReturn #False
EndIf
If *this\key = key
CopyStructure(*this\item,*item,T)
ProcedureReturn #True;
ElseIf key < *this\key
ProcedureReturn Find_Tree_#T(*this\left,*item,key);
Else
ProcedureReturn Find_Tree_#T(*this\right,*item,key);
EndIf
EndProcedure
Procedure Insert_Tree_#T(*this.Tree#T,*item,key.i)
If Not *this
*this = AllocateMemory(SizeOf(Tree#T))
InitializeStructure(*this,T)
*this\key = key
CopyStructure(*item,*this\item,T)
Else
If key <= *this\key
*this\left = insert_Tree_#T(*this\left,*item,key)
Else
*this\right = insert_Tree_#T(*this\right,*item,key)
EndIf
EndIf
ProcedureReturn(*this)
EndProcedure
Procedure Del_Nodes_Tree_#T(*this.Tree#T)
Static dct
If *this\left Or *this\right
If *this\left
del_nodes_Tree_#T(*this\left)
EndIf
If *this\right
del_nodes_Tree_#T(*this\right)
EndIf
EndIf
If *this\key
ClearStructure(*this\item,T)
FreeMemory(*this)
dct+1
EndIf
ProcedureReturn dct
EndProcedure
Procedure Free_Tree_#T(*this.Tree#T)
Protected ct
ct = del_nodes_Tree_#T(*this)
ClearStructure(*this,Tree#T)
FreeMemory(*this)
ProcedureReturn ct
EndProcedure
Procedure New_Tree_#T(*obj.Tree#T)
*obj = AllocateMemory(SizeOf(Tree#T))
If *obj
*obj\vt=?vt_tree#T
EndIf
ProcedureReturn *obj
EndProcedure
DataSection: vt_tree#T:
Data.i @Insert_Tree_#T()
Data.i @Find_Tree_#T()
Data.i @Free_Tree_#T()
EndDataSection
EndMacro
Structure mixed
a.i
str.s
EndStructure
;1) call the macro to create the class with your structure
Template_class_BTree(mixed)
;2) use the class
Global mTree.Tree_obj_mixed = new_Tree_mixed(@mTree)
Global Dim aKeys.i(100)
Global tm.mixed
Define a, tstr.s
For a = 1 To 100
tstr.s = Str(Random(100)+1)
aKeys(a) = a
tm\a = aKeys(a)
tm\str = tstr
mTree\insert(@tm,aKeys(a)) ;insert item with a key
Next
;
For a = 1 To 100
If mTree\find(@tm,aKeys(a)) ;look up item from key array
Debug "item number " + Str(a) + " Found " + tm\str + " " + Str(tm\a)
EndIf
Next
Debug mTree\Free()