Хранят строки.
;;;;;;;;;;;;;;;;;;;;;;;; DATA STRUCTURES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-------------- MAP data type ---------------------------------------------------
Type TMap
Field members ;bank with handles of records
Field pntr ;bank pointer (-4 - empty)
Field rel_size ;size of bank realloc
End Type
Type TMap_r ;map record
Field name$,dat$
End Type
Function CreateMap.TMap(rs=64)
map.TMap = New TMap
map\members = CreateBank(rs)
map\rel_size = rs
map\pntr = -4
Return map
End Function
Function TMap_Insert(map.TMap,name$,dat$)
Local r.TMap_r
If (map\pntr<>-4)
For i = 0 To pntr Step 4
r = Object.TMap_r(PeekInt(map\members,i))
If r\name = name Then
r\dat = dat
Return
EndIf
Next
EndIf
r = New TMap_r
r\name = name
r\dat = dat
If (map\pntr+8)>BankSize(map\members) Then
ResizeBank(map\members,map\pntr+map\rel_size)
EndIf
map\pntr = map\pntr + 4
PokeInt(map\members,map\pntr,Handle(r))
End Function
Function TMap_Get$(map.TMap,name$)
Local r.TMap_r
If (map\pntr<>-4)
For i = 0 To map\pntr Step 4
r = Object.TMap_r(PeekInt(map\members,i))
If r\name = name Then
Return r\dat
EndIf
Next
EndIf
End Function
Function TMap_Remove(map.TMap,name$) ;remove record
Local r.TMap_r
Local moveback
If (map\pntr<>-4)
For i = 0 To map\pntr Step 4
If moveback Then
PokeInt(map\members,map\pntr, PeekInt(map\members,map\pntr+4) )
Else
r = Object.TMap_r(PeekInt(map\members,i))
If r\name = name Then
Delete r
map\pntr = map\pntr - 4
moveback = 1
i = i - 4
EndIf
EndIf
Next
EndIf
End Function
Function TMap_Delete(map.TMap)
Local r.TMap_r
If (map\pntr<>-4)
For i = 0 To map\pntr Step 4
r = Object.TMap_r(PeekInt(map\members,i))
Delete r
Next
EndIf
FreeBank map\members
Delete map
End Function
;------------------ STACK data type ---------------------------------------------------
Type TStack
Field members
Field pntr
Field rel_size
End Type
Type TStack_r
Field dat$
End Type
Function CreateStack.TStack(rs=64)
st.TStack = New TStack
st\members = CreateBank(rs)
st\rel_size = rs
st\pntr = -4
Return st
End Function
Function TStack_Push(st.TStack,dat$)
Local r.TStack_r
r = New TStack_r
r\dat = dat
If (st\pntr+8)>BankSize(st\members) Then
ResizeBank(st\members,st\pntr+st\rel_size)
EndIf
st\pntr = st\pntr + 4
PokeInt(st\members,st\pntr,Handle(r))
End Function
Function TStack_Pop$(st.TStack)
Local r.TStack_r,res$
If (st\pntr<>-4)
r = Object.TStack_r(PeekInt(st\members,st\pntr))
res = r\dat
Delete r
st\pntr = st\pntr - 4
Return res
EndIf
End Function
Function TStack_GetLast$(st.TStack)
Local r.TStack_r
If (st\pntr<>-4)
r = Object.TStack_r(PeekInt(st\members,st\pntr))
Return r\dat
EndIf
End Function
Function TStack_Get$(st.TStack,n)
Local r.TStack_r
If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
r = Object.TStack_r(PeekInt(st\members,n*4))
Return r\dat
EndIf
End Function
Function TStack_Remove(st.TStack,n) ;remove record
Local r.TStack_r
Local moveback
If (st\pntr<>-4) And n>-1 And n*4<(st\pntr-1)
For i = 0 To st\pntr Step 4
If moveback Then
PokeInt(st\members,i,PeekInt(st\members,i+4) )
Else
r = Object.TStack_r(PeekInt(st\members,i))
If i = n*4 Then
Delete r
st\pntr = st\pntr - 4
moveback = 1
i = i - 4
EndIf
EndIf
Next
EndIf
End Function
Function TStack_Delete(st.TStack)
Local r.TStack_r
If (st\pntr<>-4)
For i = 0 To st\pntr Step 4
r = Object.TStack_r(PeekInt(st\members,i))
Delete r
Next
EndIf
FreeBank st\members
Delete st
End Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Пример:
m.TMap = CreateMap()
TMap_Insert(m,"banana","...")
TMap_Insert(m,"banana","phone")
TMap_Insert(m,"hue","hue")
Print TMap_Get(m,"banana")
TMap_Remove(m,"hue")
Print TMap_Get(m,"hue")
TMap_Delete(m)
s.TStack = CreateStack()
TStack_Push(s,"banana1")
TStack_Push(s,"banana2")
TStack_Push(s,"banana3")
TStack_Push(s,"banana4")
TStack_Push(s,"banana5")
Print TStack_Pop(s)
Print TStack_Pop(s)
Print TStack_GetLast(s)
Print TStack_Pop(s)
Print TStack_Get(s,2)
WaitKey
End