@@ -68,12 +68,50 @@ type Variant struct {
68
68
Funcs template.FuncMap
69
69
}
70
70
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
+ }
74
112
75
- if * genGeneric {
76
- generate ( & Variant {
113
+ genericVariants = [] Variant {
114
+ Variant {
77
115
Name : "generic_ordered" ,
78
116
Path : "zsortordered.go" ,
79
117
Package : "slices" ,
@@ -91,9 +129,8 @@ func main() {
91
129
return fmt .Sprintf ("%s[%s], %s[%s] = %s[%s], %s[%s]" , name , i , name , j , name , j , name , i )
92
130
},
93
131
},
94
- })
95
-
96
- generate (& Variant {
132
+ },
133
+ Variant {
97
134
Name : "generic_func" ,
98
135
Path : "zsortanyfunc.go" ,
99
136
Package : "slices" ,
@@ -110,47 +147,65 @@ func main() {
110
147
return fmt .Sprintf ("%s[%s], %s[%s] = %s[%s], %s[%s]" , name , i , name , j , name , j , name , i )
111
148
},
112
149
},
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]" ,
122
161
ExtraParam : "" ,
123
162
ExtraArg : "" ,
124
- DataType : "Interface " ,
163
+ DataType : "[]E " ,
125
164
Funcs : template.FuncMap {
126
165
"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 )
128
167
},
129
168
"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 )
131
170
},
132
171
},
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" ,
145
182
Funcs : template.FuncMap {
146
183
"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 )
148
185
},
149
186
"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 )
151
188
},
152
189
},
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 ])
154
209
}
155
210
}
156
211
0 commit comments