@@ -16,8 +16,7 @@ use std::fs::File;
16
16
use std:: io:: Write ;
17
17
use std:: path:: Path ;
18
18
19
- use common_expression:: types:: DataType ;
20
- use common_expression:: types:: NumberTypeInfo ;
19
+ use common_expression:: types:: NumberDataType ;
21
20
22
21
pub enum OP {
23
22
Plus ,
@@ -37,7 +36,7 @@ pub fn codegen_arithmetic_type_v2() {
37
36
let mut file = File :: create ( & path) . expect ( "open" ) ;
38
37
39
38
// Write the head.
40
- let codegen_src = file ! ( ) ;
39
+ let codegen_src_path = file ! ( ) ;
41
40
writeln ! (
42
41
file,
43
42
"// Copyright 2021 Datafuse Labs.
@@ -54,7 +53,10 @@ pub fn codegen_arithmetic_type_v2() {
54
53
// See the License for the specific language governing permissions and
55
54
// limitations under the License.
56
55
57
- // This code is generated by {codegen_src}. DO NOT EDIT.
56
+ // This code is generated by {codegen_src_path}. DO NOT EDIT.
57
+
58
+ use ordered_float::OrderedFloat;
59
+
58
60
use super::number::Number;
59
61
60
62
pub trait ResultTypeOfBinary: Sized {{
@@ -81,30 +83,26 @@ pub trait ResultTypeOfUnary: Sized {{
81
83
)
82
84
. unwrap ( ) ;
83
85
84
- let lhs = vec ! [
85
- DataType :: UInt8 ,
86
- DataType :: UInt16 ,
87
- DataType :: UInt32 ,
88
- DataType :: UInt64 ,
89
- DataType :: Int8 ,
90
- DataType :: Int16 ,
91
- DataType :: Int32 ,
92
- DataType :: Int64 ,
93
- DataType :: Float32 ,
94
- DataType :: Float64 ,
86
+ let number_types = vec ! [
87
+ NumberDataType :: UInt8 ,
88
+ NumberDataType :: UInt16 ,
89
+ NumberDataType :: UInt32 ,
90
+ NumberDataType :: UInt64 ,
91
+ NumberDataType :: Int8 ,
92
+ NumberDataType :: Int16 ,
93
+ NumberDataType :: Int32 ,
94
+ NumberDataType :: Int64 ,
95
+ NumberDataType :: Float32 ,
96
+ NumberDataType :: Float64 ,
95
97
] ;
96
- let rhs = lhs. clone ( ) ;
97
98
98
- for a in & lhs {
99
- for b in & rhs {
100
- let left = a. number_type_info ( ) . unwrap ( ) ;
101
- let right = b. number_type_info ( ) . unwrap ( ) ;
102
-
103
- let add_mul = arithmetic_coercion ( left, right, OP :: Plus ) ;
104
- let minus = arithmetic_coercion ( left, right, OP :: Minus ) ;
105
- let intdiv = arithmetic_coercion ( left, right, OP :: IntDiv ) ;
106
- let modulo = arithmetic_coercion ( left, right, OP :: Modulo ) ;
107
- let least_super = arithmetic_coercion ( left, right, OP :: Super ) ;
99
+ for lhs in & number_types {
100
+ for rhs in & number_types {
101
+ let add_mul = arithmetic_coercion ( * lhs, * rhs, OP :: Plus ) ;
102
+ let minus = arithmetic_coercion ( * lhs, * rhs, OP :: Minus ) ;
103
+ let intdiv = arithmetic_coercion ( * lhs, * rhs, OP :: IntDiv ) ;
104
+ let modulo = arithmetic_coercion ( * lhs, * rhs, OP :: Modulo ) ;
105
+ let least_super = arithmetic_coercion ( * lhs, * rhs, OP :: Super ) ;
108
106
109
107
writeln ! (
110
108
file,
@@ -116,8 +114,8 @@ impl ResultTypeOfBinary for ({}, {}) {{
116
114
type Modulo = {};
117
115
type LeastSuper = {};
118
116
}}" ,
119
- to_primitive_str( a . clone ( ) ) ,
120
- to_primitive_str( b . clone ( ) ) ,
117
+ to_primitive_str( * lhs ) ,
118
+ to_primitive_str( * rhs ) ,
121
119
to_primitive_str( add_mul) ,
122
120
to_primitive_str( minus) ,
123
121
to_primitive_str( intdiv) ,
@@ -128,11 +126,11 @@ impl ResultTypeOfBinary for ({}, {}) {{
128
126
}
129
127
}
130
128
131
- for arg in & lhs {
132
- let negate = neg_coercion ( arg. number_type_info ( ) . unwrap ( ) ) ;
129
+ for arg in & number_types {
130
+ let negate = neg_coercion ( * arg) ;
133
131
134
132
match negate {
135
- DataType :: Float32 | DataType :: Float64 => {
133
+ NumberDataType :: Float32 | NumberDataType :: Float64 => {
136
134
writeln ! (
137
135
file,
138
136
"
@@ -159,7 +157,7 @@ impl ResultTypeOfUnary for {} {{
159
157
Some(self % rhs)
160
158
}}
161
159
}}" ,
162
- to_primitive_str( arg. clone ( ) ) ,
160
+ to_primitive_str( * arg) ,
163
161
to_primitive_str( negate) ,
164
162
)
165
163
. unwrap ( ) ;
@@ -192,7 +190,7 @@ impl ResultTypeOfUnary for {} {{
192
190
self.checked_rem(rhs)
193
191
}}
194
192
}}" ,
195
- to_primitive_str( arg. clone ( ) ) ,
193
+ to_primitive_str( * arg) ,
196
194
to_primitive_str( negate) ,
197
195
)
198
196
. unwrap ( ) ;
@@ -202,97 +200,57 @@ impl ResultTypeOfUnary for {} {{
202
200
file. flush ( ) . unwrap ( ) ;
203
201
}
204
202
205
- fn to_primitive_str ( dt : DataType ) -> & ' static str {
203
+ fn to_primitive_str ( dt : NumberDataType ) -> & ' static str {
206
204
match dt {
207
- DataType :: UInt8 => "u8" ,
208
- DataType :: UInt16 => "u16" ,
209
- DataType :: UInt32 => "u32" ,
210
- DataType :: UInt64 => "u64" ,
211
- DataType :: Int8 => "i8" ,
212
- DataType :: Int16 => "i16" ,
213
- DataType :: Int32 => "i32" ,
214
- DataType :: Int64 => "i64" ,
215
- DataType :: Float32 => "f32" ,
216
- DataType :: Float64 => "f64" ,
217
- _ => panic ! ( "unsupported data type" ) ,
205
+ NumberDataType :: UInt8 => "u8" ,
206
+ NumberDataType :: UInt16 => "u16" ,
207
+ NumberDataType :: UInt32 => "u32" ,
208
+ NumberDataType :: UInt64 => "u64" ,
209
+ NumberDataType :: Int8 => "i8" ,
210
+ NumberDataType :: Int16 => "i16" ,
211
+ NumberDataType :: Int32 => "i32" ,
212
+ NumberDataType :: Int64 => "i64" ,
213
+ NumberDataType :: Float32 => "OrderedFloat<f32>" ,
214
+ NumberDataType :: Float64 => "OrderedFloat<f64>" ,
218
215
}
219
216
}
220
217
221
- fn arithmetic_coercion ( a : NumberTypeInfo , b : NumberTypeInfo , op : OP ) -> DataType {
222
- let is_signed = a. is_signed || b. is_signed ;
223
- let is_float = a. is_float || b. is_float ;
224
- let bit_width = a. bit_width . max ( b. bit_width ) ;
218
+ fn arithmetic_coercion ( a : NumberDataType , b : NumberDataType , op : OP ) -> NumberDataType {
219
+ let is_signed = a. is_signed ( ) || b. is_signed ( ) ;
220
+ let is_float = a. is_float ( ) || b. is_float ( ) ;
221
+ let bit_width = a. bit_width ( ) . max ( b. bit_width ( ) ) ;
225
222
226
223
match op {
227
- OP :: Plus | OP :: Mul => {
228
- let info = NumberTypeInfo {
229
- is_signed,
230
- is_float,
231
- bit_width : next_bit_width ( bit_width) ,
232
- } ;
233
-
234
- DataType :: new_number ( info)
235
- }
224
+ OP :: Plus | OP :: Mul => NumberDataType :: new ( next_bit_width ( bit_width) , is_signed, is_float) ,
236
225
OP :: Modulo => {
237
226
if is_float {
238
- return DataType :: Float64 ;
227
+ return NumberDataType :: Float64 ;
239
228
}
240
- let result_is_signed = a. is_signed ;
241
- let right_size = b. bit_width ;
229
+ let result_is_signed = a. is_signed ( ) ;
230
+ let right_size = b. bit_width ( ) ;
242
231
let size_of_result = if result_is_signed {
243
232
next_bit_width ( right_size)
244
233
} else {
245
234
right_size
246
235
} ;
247
236
248
- let info = NumberTypeInfo {
249
- is_signed : result_is_signed,
250
- is_float : false ,
251
- bit_width : size_of_result,
252
- } ;
253
- DataType :: new_number ( info)
254
- }
255
- OP :: Minus => {
256
- let info = NumberTypeInfo {
257
- is_signed : true ,
258
- is_float,
259
- bit_width : next_bit_width ( bit_width) ,
260
- } ;
261
- DataType :: new_number ( info)
262
- }
263
- OP :: Div => DataType :: Float64 ,
264
- OP :: IntDiv => {
265
- let info = NumberTypeInfo {
266
- is_signed,
267
- is_float : false ,
268
- bit_width,
269
- } ;
270
- DataType :: new_number ( info)
271
- }
272
- OP :: Super => {
273
- let info = NumberTypeInfo {
274
- is_signed,
275
- is_float,
276
- bit_width,
277
- } ;
278
- DataType :: new_number ( info)
237
+ NumberDataType :: new ( size_of_result, result_is_signed, false )
279
238
}
239
+ OP :: Minus => NumberDataType :: new ( next_bit_width ( bit_width) , true , is_float) ,
240
+ OP :: Div => NumberDataType :: Float64 ,
241
+ OP :: IntDiv => NumberDataType :: new ( bit_width, is_signed, false ) ,
242
+ OP :: Super => NumberDataType :: new ( bit_width, is_signed, is_float) ,
280
243
}
281
244
}
282
245
283
- fn neg_coercion ( a : NumberTypeInfo ) -> DataType {
284
- let bit_width = if a. is_signed {
285
- a. bit_width
246
+ fn neg_coercion ( a : NumberDataType ) -> NumberDataType {
247
+ let bit_width = if a. is_signed ( ) {
248
+ a. bit_width ( )
286
249
} else {
287
- next_bit_width ( a. bit_width )
250
+ next_bit_width ( a. bit_width ( ) )
288
251
} ;
289
252
290
- let info = NumberTypeInfo {
291
- is_float : a. is_float ,
292
- is_signed : true ,
293
- bit_width,
294
- } ;
295
- DataType :: new_number ( info)
253
+ NumberDataType :: new ( bit_width, true , a. is_float ( ) )
296
254
}
297
255
298
256
const fn next_bit_width ( width : u8 ) -> u8 {
0 commit comments