forked from flosch/GoPy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stack.go
82 lines (72 loc) · 1.36 KB
/
stack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package vm
import (
"log"
)
// PyObjStack
type PyObjStack struct {
items []PyObject
count int
}
func NewPyObjStack(count uint64) *PyObjStack {
return &PyObjStack{
items: make([]PyObject, count),
}
}
func (s *PyObjStack) Push(item PyObject) {
if s.count >= len(s.items) {
// way better than append() because of continual memory allocation
if debugMode {
log.Println("!!! More PyObjStack space required, acquiring...")
}
items := make([]PyObject, len(s.items)*2)
copy(items, s.items)
s.items = items
}
s.items[s.count] = item
s.count++
}
func (s *PyObjStack) Pop() PyObject {
if s.count == 0 {
return nil
}
item := s.items[s.count-1]
s.count--
return item
}
// BlockStack
type Block struct {
position,
position2 int64
}
type BlockStack struct {
items []*Block
count int
}
func NewBlockStack(count uint64) *BlockStack {
return &BlockStack{
items: make([]*Block, count),
}
}
func (s *BlockStack) Push(position, position2 int64) {
if s.count >= len(s.items) {
if debugMode {
log.Println("!!! More BlockStack space required, acquiring...")
}
items := make([]*Block, len(s.items)*2)
copy(items, s.items)
s.items = items
}
s.items[s.count] = &Block{
position: position,
position2: position2,
}
s.count++
}
func (s *BlockStack) Pop() *Block {
if s.count == 0 {
return nil
}
item := s.items[s.count-1]
s.count--
return item
}