Skip to content

Commit 862fa6d

Browse files
ianlancetaylorgopherbot
authored andcommitted
sort: add gen_sort_variants support for x/exp/slices
Also add a go:generate command to the standard library slices package. For #61374 Change-Id: I7aae8e451b7c6c4390e0344257478d1a96a14189 Reviewed-on: https://go-review.googlesource.com/c/go/+/511660 Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Eli Bendersky <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 6f597a8 commit 862fa6d

File tree

2 files changed

+92
-35
lines changed

2 files changed

+92
-35
lines changed

src/slices/sort.go

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style
33
// license that can be found in the LICENSE file.
44

5+
//go:generate go run $GOROOT/src/sort/gen_sort_variants.go -generic
6+
57
package slices
68

79
import (

src/sort/gen_sort_variants.go

+90-35
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,50 @@ type Variant struct {
6868
Funcs template.FuncMap
6969
}
7070

71-
func main() {
72-
genGeneric := flag.Bool("generic", false, "generate generic versions")
73-
flag.Parse()
71+
var (
72+
traditionalVariants = []Variant{
73+
Variant{
74+
Name: "interface",
75+
Path: "zsortinterface.go",
76+
Package: "sort",
77+
Imports: "",
78+
FuncSuffix: "",
79+
TypeParam: "",
80+
ExtraParam: "",
81+
ExtraArg: "",
82+
DataType: "Interface",
83+
Funcs: template.FuncMap{
84+
"Less": func(name, i, j string) string {
85+
return fmt.Sprintf("%s.Less(%s, %s)", name, i, j)
86+
},
87+
"Swap": func(name, i, j string) string {
88+
return fmt.Sprintf("%s.Swap(%s, %s)", name, i, j)
89+
},
90+
},
91+
},
92+
Variant{
93+
Name: "func",
94+
Path: "zsortfunc.go",
95+
Package: "sort",
96+
Imports: "",
97+
FuncSuffix: "_func",
98+
TypeParam: "",
99+
ExtraParam: "",
100+
ExtraArg: "",
101+
DataType: "lessSwap",
102+
Funcs: template.FuncMap{
103+
"Less": func(name, i, j string) string {
104+
return fmt.Sprintf("%s.Less(%s, %s)", name, i, j)
105+
},
106+
"Swap": func(name, i, j string) string {
107+
return fmt.Sprintf("%s.Swap(%s, %s)", name, i, j)
108+
},
109+
},
110+
},
111+
}
74112

75-
if *genGeneric {
76-
generate(&Variant{
113+
genericVariants = []Variant{
114+
Variant{
77115
Name: "generic_ordered",
78116
Path: "zsortordered.go",
79117
Package: "slices",
@@ -91,9 +129,8 @@ func main() {
91129
return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
92130
},
93131
},
94-
})
95-
96-
generate(&Variant{
132+
},
133+
Variant{
97134
Name: "generic_func",
98135
Path: "zsortanyfunc.go",
99136
Package: "slices",
@@ -110,47 +147,65 @@ func main() {
110147
return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
111148
},
112149
},
113-
})
114-
} else {
115-
generate(&Variant{
116-
Name: "interface",
117-
Path: "zsortinterface.go",
118-
Package: "sort",
119-
Imports: "",
120-
FuncSuffix: "",
121-
TypeParam: "",
150+
},
151+
}
152+
153+
expVariants = []Variant{
154+
Variant{
155+
Name: "exp_ordered",
156+
Path: "zsortordered.go",
157+
Package: "slices",
158+
Imports: "import \"golang.org/x/exp/constraints\"\n",
159+
FuncSuffix: "Ordered",
160+
TypeParam: "[E constraints.Ordered]",
122161
ExtraParam: "",
123162
ExtraArg: "",
124-
DataType: "Interface",
163+
DataType: "[]E",
125164
Funcs: template.FuncMap{
126165
"Less": func(name, i, j string) string {
127-
return fmt.Sprintf("%s.Less(%s, %s)", name, i, j)
166+
return fmt.Sprintf("cmpLess(%s[%s], %s[%s])", name, i, name, j)
128167
},
129168
"Swap": func(name, i, j string) string {
130-
return fmt.Sprintf("%s.Swap(%s, %s)", name, i, j)
169+
return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
131170
},
132171
},
133-
})
134-
135-
generate(&Variant{
136-
Name: "func",
137-
Path: "zsortfunc.go",
138-
Package: "sort",
139-
Imports: "",
140-
FuncSuffix: "_func",
141-
TypeParam: "",
142-
ExtraParam: "",
143-
ExtraArg: "",
144-
DataType: "lessSwap",
172+
},
173+
Variant{
174+
Name: "exp_func",
175+
Path: "zsortanyfunc.go",
176+
Package: "slices",
177+
FuncSuffix: "CmpFunc",
178+
TypeParam: "[E any]",
179+
ExtraParam: ", cmp func(a, b E) int",
180+
ExtraArg: ", cmp",
181+
DataType: "[]E",
145182
Funcs: template.FuncMap{
146183
"Less": func(name, i, j string) string {
147-
return fmt.Sprintf("%s.Less(%s, %s)", name, i, j)
184+
return fmt.Sprintf("(cmp(%s[%s], %s[%s]) < 0)", name, i, name, j)
148185
},
149186
"Swap": func(name, i, j string) string {
150-
return fmt.Sprintf("%s.Swap(%s, %s)", name, i, j)
187+
return fmt.Sprintf("%s[%s], %s[%s] = %s[%s], %s[%s]", name, i, name, j, name, j, name, i)
151188
},
152189
},
153-
})
190+
},
191+
}
192+
)
193+
194+
func main() {
195+
genGeneric := flag.Bool("generic", false, "generate generic versions")
196+
genExp := flag.Bool("exp", false, "generate x/exp/slices versions")
197+
flag.Parse()
198+
199+
var variants []Variant
200+
if *genExp {
201+
variants = expVariants
202+
} else if *genGeneric {
203+
variants = genericVariants
204+
} else {
205+
variants = traditionalVariants
206+
}
207+
for i := range variants {
208+
generate(&variants[i])
154209
}
155210
}
156211

0 commit comments

Comments
 (0)