2021-09-23 11:45:49 +02:00
|
|
|
package pointer
|
2021-09-21 00:28:31 +02:00
|
|
|
|
2021-11-12 15:26:16 +01:00
|
|
|
import "git.adyxax.org/adyxax/gofunge98/pkg/stack"
|
|
|
|
|
2021-09-21 00:28:31 +02:00
|
|
|
type StackStack struct {
|
2021-11-12 15:26:16 +01:00
|
|
|
head *stack.Stack
|
2021-09-21 00:28:31 +02:00
|
|
|
height int
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewStackStack() *StackStack {
|
|
|
|
return &StackStack{
|
2021-11-12 15:26:16 +01:00
|
|
|
head: stack.NewStack(32, nil),
|
2021-09-21 00:28:31 +02:00
|
|
|
height: 1,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-23 11:45:49 +02:00
|
|
|
func (ss *StackStack) Begin(p *Pointer) {
|
2021-09-22 00:31:53 +02:00
|
|
|
ss.height++
|
2021-09-21 00:28:31 +02:00
|
|
|
soss := ss.head
|
|
|
|
n := soss.Pop()
|
|
|
|
np := n
|
|
|
|
if np < 0 {
|
|
|
|
np = -np
|
|
|
|
}
|
2021-11-12 15:26:16 +01:00
|
|
|
toss := stack.NewStack(np, soss)
|
2021-09-21 00:28:31 +02:00
|
|
|
ss.head = toss
|
2021-09-24 01:26:49 +02:00
|
|
|
if n > 0 {
|
2021-11-12 15:26:16 +01:00
|
|
|
toss.Transfert(soss, n)
|
2021-09-24 01:26:49 +02:00
|
|
|
} else if n < 0 {
|
|
|
|
for i := 0; i < np; i++ {
|
|
|
|
soss.Push(0)
|
|
|
|
}
|
2021-09-21 00:28:31 +02:00
|
|
|
}
|
|
|
|
x, y := p.GetStorageOffset()
|
|
|
|
soss.Push(x)
|
|
|
|
soss.Push(y)
|
|
|
|
p.CalculateNewStorageOffset()
|
|
|
|
}
|
2021-09-22 23:34:59 +02:00
|
|
|
|
2021-09-23 11:45:49 +02:00
|
|
|
func (ss *StackStack) End(p *Pointer) (reflect bool) {
|
2021-09-22 23:34:59 +02:00
|
|
|
if ss.height == 1 {
|
|
|
|
return true
|
|
|
|
}
|
2021-11-12 15:26:16 +01:00
|
|
|
toss := ss.head
|
|
|
|
soss := ss.head.Next()
|
2021-09-22 23:34:59 +02:00
|
|
|
n := ss.head.Pop()
|
|
|
|
y := soss.Pop()
|
|
|
|
x := soss.Pop()
|
|
|
|
p.SetStorageOffset(x, y)
|
|
|
|
if n > 0 {
|
2021-11-12 15:26:16 +01:00
|
|
|
soss.Transfert(toss, n)
|
2021-09-24 01:26:49 +02:00
|
|
|
} else if n < 0 {
|
2021-11-12 15:26:16 +01:00
|
|
|
soss.Discard(-n)
|
2021-09-22 23:34:59 +02:00
|
|
|
}
|
|
|
|
ss.height--
|
2021-10-06 00:08:14 +02:00
|
|
|
ss.head = soss
|
2021-09-22 23:34:59 +02:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ss *StackStack) Under() (reflect bool) {
|
|
|
|
if ss.height == 1 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
n := ss.head.Pop()
|
|
|
|
if n > 0 {
|
|
|
|
for i := 0; i < n; i++ {
|
2021-11-12 15:26:16 +01:00
|
|
|
ss.head.Push(ss.head.Next().Pop())
|
2021-09-22 23:34:59 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for i := 0; i < -n; i++ {
|
2021-11-12 15:26:16 +01:00
|
|
|
ss.head.Next().Push(ss.head.Pop())
|
2021-09-22 23:34:59 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
2021-11-12 15:26:16 +01:00
|
|
|
|
|
|
|
func (s StackStack) GetHeights() []int {
|
|
|
|
return s.head.GetHeights()
|
|
|
|
}
|