summaryrefslogtreecommitdiff
path: root/generateIterator.go
blob: a7102129fe01e8abaf20d0fe4701ee94d91655d9 (plain)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main

import (
	"fmt"
	"io"
)

// only make one of these for each message in the protobuf file
func newIter(w io.Writer, FRUIT, APPLE, APPLES, LOCK string) {
	fmt.Fprintln(w, "// DEFINE THE ITERATOR. is unique to the "+APPLE+" protobuf message")
	fmt.Fprintln(w, "// itializes a new iterator.")
	fmt.Fprintln(w, "func New"+APPLE+"Iterator(things []*"+APPLE+") *"+APPLE+"Iterator {")
	fmt.Fprintln(w, "	return &"+APPLE+"Iterator{things: things}")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "// safely returns a slice of pointers to the FRUIT protobufs")
	fmt.Fprintln(w, "func (x *"+FRUIT+") all"+APPLES+"() []*"+APPLE+" {")
	fmt.Fprintln(w, "	"+LOCK+".RLock()")
	fmt.Fprintln(w, "	defer "+LOCK+".RUnlock()")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	// Create a new slice to hold pointers to each FRUIT")
	fmt.Fprintln(w, "	var tmp []*"+APPLE+"")
	fmt.Fprintln(w, "	tmp = make([]*"+APPLE+", len(x."+APPLES+"))")
	fmt.Fprintln(w, "	for i, p := range x."+APPLES+" {")
	fmt.Fprintln(w, "		tmp[i] = p // Copy pointers for safe iteration")
	fmt.Fprintln(w, "	}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	return tmp")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "type "+APPLE+"Iterator struct {")
	fmt.Fprintln(w, "	sync.RWMutex // this isn't getting used properly yet?")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	things []*"+APPLE+"")
	fmt.Fprintln(w, "	index  int")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "func (it *"+APPLE+"Iterator) Scan() bool {")
	fmt.Fprintln(w, "	if it.index >= len(it.things) {")
	fmt.Fprintln(w, "		return false")
	fmt.Fprintln(w, "	}")
	fmt.Fprintln(w, "	it.index++")
	fmt.Fprintln(w, "	return true")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "// Next() returns the next thing in the array")
	fmt.Fprintln(w, "func (it *"+APPLE+"Iterator) Next() *"+APPLE+" {")
	fmt.Fprintln(w, "	if it.things[it.index-1] == nil {")
	fmt.Fprintln(w, "		fmt.Println(\"Next() error in "+APPLE+"Iterator\", it.index)")
	fmt.Fprintln(w, "	}")
	fmt.Fprintln(w, "	return it.things[it.index-1]")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "// END DEFINE THE ITERATOR")
	fmt.Fprintln(w, "")
}

func newSortBy(w io.Writer, FRUIT, APPLE, APPLES, COLOR string) {
	fmt.Fprintln(w, "// START sort by ", COLOR, "(this is all you need once the Iterator is defined)")
	fmt.Fprintln(w, "type "+APPLE+COLOR+" []*"+APPLE+"")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "func (a "+APPLE+COLOR+") Len() int           { return len(a) }")
	fmt.Fprintln(w, "func (a "+APPLE+COLOR+") Less(i, j int) bool { return a[i]."+COLOR+" < a[j]."+COLOR+" }")
	fmt.Fprintln(w, "func (a "+APPLE+COLOR+") Swap(i, j int)      { a[i], a[j] = a[j], a[i] }")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "func (x *"+FRUIT+") SortBy"+COLOR+"() *"+APPLE+"Iterator {")
	fmt.Fprintln(w, "	things := x.all"+APPLES+"()")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	sort.Sort("+APPLE+COLOR+"(things))")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	iterator := New"+APPLE+"Iterator(things)")
	fmt.Fprintln(w, "	return iterator")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "// END sort by", COLOR)
}

func addAllFunc(w io.Writer, FRUIT, APPLE, LOCK string) {
	fmt.Fprintln(w, "func (x *"+FRUIT+") All() *"+APPLE+"Iterator {")
	fmt.Fprintln(w, "	"+APPLE+"Pointers := x.selectAll"+APPLE+"()")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	iterator := New"+APPLE+"Iterator("+APPLE+"Pointers)")
	fmt.Fprintln(w, "	return iterator")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
}

func addLenFunc(w io.Writer, FRUIT, APPLES, LOCK string) {
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "func (x *"+FRUIT+") Len() int {")
	fmt.Fprintln(w, "	"+LOCK+".RLock()")
	fmt.Fprintln(w, "	defer "+LOCK+".RUnlock()")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	return len(x."+APPLES+")")
	fmt.Fprintln(w, "}")
	fmt.Fprintln(w, "")
}

func addSelectAll(w io.Writer, FRUIT, APPLE, APPLES, LOCK string) {
	fmt.Fprintln(w, "// safely returns a slice of pointers to the "+APPLE+" protobufs")
	fmt.Fprintln(w, "func (x *"+FRUIT+") selectAll"+APPLE+"() []*"+APPLE+" {")
	fmt.Fprintln(w, "	"+LOCK+".RLock()")
	fmt.Fprintln(w, "	defer "+LOCK+".RUnlock()")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	// Create a new slice to hold pointers to each "+APPLE+"")
	fmt.Fprintln(w, "	var tmp []*"+APPLE+"")
	fmt.Fprintln(w, "	tmp = make([]*"+APPLE+", len(x."+APPLES+"))")
	fmt.Fprintln(w, "	for i, p := range x."+APPLES+" {")
	fmt.Fprintln(w, "		tmp[i] = p // Copy pointers for safe iteration")
	fmt.Fprintln(w, "	}")
	fmt.Fprintln(w, "")
	fmt.Fprintln(w, "	return tmp")
	fmt.Fprintln(w, "}")
}