AHK Stacks by no1readsthese
Description:
Stacks or Last In First Out (LIFO) data structures based on strings with delimiter instead of arrays
mostly proof of concept
Usage:
Set And Change Delimiter:
Code:
AHKStack_Delimiter := "Delimiter"
;Sets Delimiter For Future Stacks
;Default Delimiter Is "`n"
;Do Not Use After A Stack Has Been Created
AHKStack_ChangeDelimiter(Stack, NewDelimiter="")
;Changes Delimiter For Current And Future Stacks
;If No Delimiter Is Defined, "`n" Is Used
IsEmpty:
Code:
Var := AHKStack_IsEmpty(Stack)
;Returns 1 If Stack Is Empty
;Returns 0 If Stack Is Not Empty
Size:
Code:
Var := AHKStack_Size(Stack)
;Returns The Size Of The Stack To Var
Push:
Code:
AHKStack_Push(Stack, Element)
;Pushes The Element Into The Stack
Pop:
Code:
Var := AHKStack_Pop(Stack)
;Removes The Last Element From The Stack And
;Returns Said Element
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Poop (The Counterpart Of Pop. Thanks [VxE]):
Code:
Var := AHKStack_Poop(Stack)
;Removes The First Element From The Stack And
;Returns Said Element
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Peek:
Code:
Var := AHKStack_Peek(Stack, Index="")
;Returns The Element At The Index, Where The First Element Is At Index 1
;Returns The Last Element If No Index Is Defined
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Clear:
Code:
AHKStack_Clear(Stack)
OR
Stack := ""
;Clears Stack Of All Elements
Copy Stack:
Code:
NewStack := AHKStack_Copy(Stack)
OR
NewStack := Stack
;Copies Stack To NewStack
Script:Code:
;=================================================
;== AHK Stacks by no1readsthese ==
;=================================================
/*
;=================================================
;=======================Use=======================
;=================================================
Set And Change Delimiter:
AHKStack_Delimiter := "Delimiter"
;Sets Delimiter For Future Stacks
;Default Delimiter Is "`n"
;Do Not Use After A Stack Has Been Created
AHKStack_ChangeDelimiter(Stack, NewDelimiter="")
;Changes Delimiter For Current And Future Stacks
;If No Delimiter Is Defined, "`n" Is Used
IsEmpty:
Var := AHKStack_IsEmpty(Stack)
;Returns 1 If Stack Is Empty
;Returns 0 If Stack Is Not Empty
Size:
Var := AHKStack_Size(Stack)
;Returns The Size Of The Stack To Var
Push:
AHKStack_Push(Stack, Element)
;Pushes The Element Into The Stack
Pop:
Var := AHKStack_Pop(Stack)
;Removes The Last Element From The Stack And
;Returns Said Element
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Poop (The Counterpart Of Pop. Thanks [VxE]):
Var := AHKStack_Poop(Stack)
;Removes The First Element From The Stack And
;Returns Said Element
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Peek:
Var := AHKStack_Peek(Stack, Index="")
;Returns The Element At The Index, Where The First Element Is At Index 1
;Returns The Last Element If No Index Is Defined
;If Stack Is Empty, The ERRORLEVEL Var Is Set To 1 And The Function Returns An Empty String
;ERRORLEVEL Is Otherwise Set To 0
Clear:
AHKStack_Clear(Stack)
OR
Stack := ""
;Clears Stack Of All Elements
Copy Stack:
NewStack := AHKStack_Copy(Stack)
OR
NewStack := Stack
;Copies Stack To NewStack
*/
;=================================================
;====================Functions====================
;=================================================
AHKStack_Delimiter := "`n"
AHKStack_ChangeDelimiter(ByRef Stack, NewDelimiter="")
{
Global AHKStack_Delimiter
If Not NewDelimiter
NewDelimiter := "`n"
StringReplace, Stack, Stack, %AHKStack_Delimiter%, %NewDelimiter%, All
AHKStack_Delimiter := NewDelimiter
Return Stack
}
AHKStack_IsEmpty(ByRef Stack)
{
If Stack
Return 0
Return 1
}
AHKStack_Size(ByRef Stack)
{
Global AHKStack_Delimiter
If Not Stack
Return 0
StringReplace, Stack, Stack, %AHKStack_Delimiter%, %AHKStack_Delimiter%, UseErrorLevel
Return ErrorLevel + 1
}
AHKStack_Push(ByRef Stack, Element)
{
Global AHKStack_Delimiter
StringReplace, Element, Element, %AHKStack_Delimiter%,, All
If Not Stack
Stack := Element
Else
Stack := Element AHKStack_Delimiter Stack
Return Stack
}
AHKStack_Pop(ByRef Stack)
{
Global AHKStack_Delimiter
EnvSet, ERRORLEVEL, 0
Position := InStr(Stack, AHKStack_Delimiter)
If Position
{
Element := SubStr(Stack, 1, Position-1)
Stack := SubStr(Stack, Position+1)
Return Element
}
If Stack
{
Element := Stack
Stack := ""
Return Element
}
StringGetPos, Position, Position, SearchText ;Sets ERRORLEVEL To 1
}
AHKStack_Poop(ByRef Stack) ; Tweaked by [VxE]
{
Global AHKStack_Delimiter
EnvSet, ERRORLEVEL, 0
Position := InStr(Stack, AHKStack_Delimiter, 0, 0)
If Position
{
Element := SubStr(Stack, Position+1)
Stack := SubStr(Stack, 1, Position-1)
Return Element
}
If Stack
{
Element := Stack
Stack := ""
Return Element
}
StringGetPos, Position, Position, SearchText ;Sets ERRORLEVEL To 1
}
AHKStack_Peek(ByRef Stack, Index="")
{
Global AHKStack_Delimiter
EnvSet, ERRORLEVEL, 0
If Not Stack
{
StringGetPos, Var, Var, SearchText ;Sets ERRORLEVEL To 1
Return
}
StringSplit, StackArray, Stack, %AHKStack_Delimiter%
If Not Index
Return StackArray1
Index := StackArray0 - Index - 1
Return StackArray%Index%
}
AHKStack_Clear(ByRef Stack)
{
Stack := ""
Return Stack
}
AHKStack_Copy(ByRef Stack)
{
Return Stack
}