@@ -16,8 +16,9 @@ type iterator interface {
16
16
17
17
// SetIterator is very primitive, just used to hold a place in a set.
18
18
type SetIterator struct {
19
- i int
20
- set Set
19
+ i int
20
+ set Set
21
+ buffer Set
21
22
}
22
23
23
24
func union (sets ... Set ) * SetIterator {
@@ -26,8 +27,9 @@ func union(sets ...Set) *SetIterator {
26
27
all = append (all , set ... )
27
28
}
28
29
return & SetIterator {
29
- i : 0 ,
30
- set : all ,
30
+ i : 0 ,
31
+ set : all ,
32
+ buffer : make (Set , 1 ),
31
33
}
32
34
}
33
35
@@ -37,7 +39,8 @@ func (si *SetIterator) Next() bool {
37
39
}
38
40
39
41
func (si * SetIterator ) Permissions () Set {
40
- return Set {si .set [si .i ]}
42
+ si .buffer [0 ] = si .set [si .i ]
43
+ return si .buffer
41
44
}
42
45
43
46
func (si * SetIterator ) Permission () * Permission {
@@ -61,18 +64,21 @@ func (si *SetIterator) Iterator() iterator {
61
64
}
62
65
63
66
type productIterator struct {
64
- i , j int
65
- a Set
66
- b Set
67
+ i , j int
68
+ a Set
69
+ b Set
70
+ buffer Set
67
71
}
68
72
69
73
func product (a , b Set ) * productIterator {
70
- return & productIterator {
74
+ i := & productIterator {
71
75
i : 0 ,
72
76
j : 0 ,
73
77
a : a ,
74
78
b : b ,
75
79
}
80
+ i .buffer = make (Set , i .ReturnSize ())
81
+ return i
76
82
}
77
83
78
84
func (s * productIterator ) Next () bool {
@@ -88,7 +94,9 @@ func (s *productIterator) Next() bool {
88
94
}
89
95
90
96
func (s productIterator ) Permissions () Set {
91
- return Set {s .a [s .i ], s .b [s .j ]}
97
+ s .buffer [0 ] = s .a [s .i ]
98
+ s .buffer [1 ] = s .b [s .j ]
99
+ return s .buffer
92
100
}
93
101
94
102
func (s * productIterator ) Reset () {
@@ -105,4 +113,4 @@ func (s *productIterator) Size() int {
105
113
106
114
func (s * productIterator ) Iterator () iterator {
107
115
return s
108
- }
116
+ }
0 commit comments