Skip to content

Commit 5ba4515

Browse files
authored
Simplify downcast_...!() macro definitions (apache#9454)
1. Reduce some quantifiers from `*` to `?` when 2+ occurrences would generate invalid Rust code. `$(if $pred:expr)*` 2. Clean up 4-armed recursive macros: * put the base case first * explain the fixups * fix all at once, going directly to the base case, instead of possibly multiple hoops The inital motivation was getting rust-analyzer to stop choking on such macros usage where the left-hand side was a tuple and the right-hand-side an expr.
1 parent 8c89814 commit 5ba4515

File tree

1 file changed

+58
-49
lines changed

1 file changed

+58
-49
lines changed

arrow-array/src/cast.rs

Lines changed: 58 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ macro_rules! repeat_pat {
7474
/// [`DataType`]: arrow_schema::DataType
7575
#[macro_export]
7676
macro_rules! downcast_integer {
77-
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
77+
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
7878
match ($($data_type),+) {
7979
$crate::repeat_pat!($crate::cast::__private::DataType::Int8, $($data_type),+) => {
8080
$m!($crate::types::Int8Type $(, $args)*)
@@ -100,7 +100,7 @@ macro_rules! downcast_integer {
100100
$crate::repeat_pat!($crate::cast::__private::DataType::UInt64, $($data_type),+) => {
101101
$m!($crate::types::UInt64Type $(, $args)*)
102102
}
103-
$($p $(if $pred)* => $fallback,)*
103+
$($p $(if $pred)? => $fallback,)*
104104
}
105105
};
106106
}
@@ -138,21 +138,24 @@ macro_rules! downcast_integer {
138138
/// [`DataType`]: arrow_schema::DataType
139139
#[macro_export]
140140
macro_rules! downcast_integer_array {
141-
($values:ident => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
142-
$crate::downcast_integer_array!($values => {$e} $($p $(if $pred)* => $fallback)*)
143-
};
144-
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
145-
$crate::downcast_integer_array!($($values),+ => {$e} $($p $(if $pred)* => $fallback)*)
146-
};
147-
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
148-
$crate::downcast_integer_array!(($($values),+) => $e $($p $(if $pred)* => $fallback)*)
149-
};
150-
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
141+
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
151142
$crate::downcast_integer!{
152143
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
153-
$($p $(if $pred)* => $fallback,)*
144+
$($p $(if $pred)? => $fallback,)*
154145
}
155146
};
147+
// Turn $e into a block.
148+
($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
149+
$crate::downcast_integer_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
150+
};
151+
// Remove $values parentheses.
152+
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
153+
$crate::downcast_integer_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
154+
};
155+
// Turn $e into a block & remove $values parentheses.
156+
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
157+
$crate::downcast_integer_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
158+
};
156159
}
157160

158161
/// Given one or more expressions evaluating to an integer [`DataType`] invokes the provided macro
@@ -189,7 +192,7 @@ macro_rules! downcast_integer_array {
189192
/// [`DataType`]: arrow_schema::DataType
190193
#[macro_export]
191194
macro_rules! downcast_run_end_index {
192-
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
195+
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
193196
match ($($data_type),+) {
194197
$crate::repeat_pat!($crate::cast::__private::DataType::Int16, $($data_type),+) => {
195198
$m!($crate::types::Int16Type $(, $args)*)
@@ -200,7 +203,7 @@ macro_rules! downcast_run_end_index {
200203
$crate::repeat_pat!($crate::cast::__private::DataType::Int64, $($data_type),+) => {
201204
$m!($crate::types::Int64Type $(, $args)*)
202205
}
203-
$($p $(if $pred)* => $fallback,)*
206+
$($p $(if $pred)? => $fallback,)*
204207
}
205208
};
206209
}
@@ -234,7 +237,7 @@ macro_rules! downcast_run_end_index {
234237
/// [`DataType`]: arrow_schema::DataType
235238
#[macro_export]
236239
macro_rules! downcast_temporal {
237-
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
240+
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
238241
match ($($data_type),+) {
239242
$crate::repeat_pat!($crate::cast::__private::DataType::Time32($crate::cast::__private::TimeUnit::Second), $($data_type),+) => {
240243
$m!($crate::types::Time32SecondType $(, $args)*)
@@ -266,7 +269,7 @@ macro_rules! downcast_temporal {
266269
$crate::repeat_pat!($crate::cast::__private::DataType::Timestamp($crate::cast::__private::TimeUnit::Nanosecond, _), $($data_type),+) => {
267270
$m!($crate::types::TimestampNanosecondType $(, $args)*)
268271
}
269-
$($p $(if $pred)* => $fallback,)*
272+
$($p $(if $pred)? => $fallback,)*
270273
}
271274
};
272275
}
@@ -304,21 +307,24 @@ macro_rules! downcast_temporal {
304307
/// [`DataType`]: arrow_schema::DataType
305308
#[macro_export]
306309
macro_rules! downcast_temporal_array {
307-
($values:ident => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
308-
$crate::downcast_temporal_array!($values => {$e} $($p $(if $pred)* => $fallback)*)
309-
};
310-
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
311-
$crate::downcast_temporal_array!($($values),+ => {$e} $($p $(if $pred)* => $fallback)*)
312-
};
313-
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
314-
$crate::downcast_temporal_array!(($($values),+) => $e $($p $(if $pred)* => $fallback)*)
315-
};
316-
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
310+
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
317311
$crate::downcast_temporal!{
318312
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
319-
$($p $(if $pred)* => $fallback,)*
313+
$($p $(if $pred)? => $fallback,)*
320314
}
321315
};
316+
// Turn $e into a block.
317+
($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
318+
$crate::downcast_temporal_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
319+
};
320+
// Remove $values parentheses.
321+
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
322+
$crate::downcast_temporal_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
323+
};
324+
// Turn $e into a block & remove $values parentheses.
325+
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
326+
$crate::downcast_temporal_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
327+
};
322328
}
323329

324330
/// Given one or more expressions evaluating to primitive [`DataType`] invokes the provided macro
@@ -353,7 +359,7 @@ macro_rules! downcast_temporal_array {
353359
/// [`DataType`]: arrow_schema::DataType
354360
#[macro_export]
355361
macro_rules! downcast_primitive {
356-
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
362+
($($data_type:expr),+ => ($m:path $(, $args:tt)*), $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
357363
$crate::downcast_integer! {
358364
$($data_type),+ => ($m $(, $args)*),
359365
$crate::repeat_pat!($crate::cast::__private::DataType::Float16, $($data_type),+) => {
@@ -401,7 +407,7 @@ macro_rules! downcast_primitive {
401407
_ => {
402408
$crate::downcast_temporal! {
403409
$($data_type),+ => ($m $(, $args)*),
404-
$($p $(if $pred)* => $fallback,)*
410+
$($p $(if $pred)? => $fallback,)*
405411
}
406412
}
407413
}
@@ -450,21 +456,24 @@ macro_rules! downcast_primitive_array_helper {
450456
/// [`DataType`]: arrow_schema::DataType
451457
#[macro_export]
452458
macro_rules! downcast_primitive_array {
453-
($values:ident => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
454-
$crate::downcast_primitive_array!($values => {$e} $($p $(if $pred)* => $fallback)*)
455-
};
456-
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
457-
$crate::downcast_primitive_array!($($values),+ => {$e} $($p $(if $pred)* => $fallback)*)
458-
};
459-
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
460-
$crate::downcast_primitive_array!(($($values),+) => $e $($p $(if $pred)* => $fallback)*)
461-
};
462-
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
459+
($($values:ident),+ => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
463460
$crate::downcast_primitive!{
464461
$($values.data_type()),+ => ($crate::downcast_primitive_array_helper, $($values),+, $e),
465-
$($p $(if $pred)* => $fallback,)*
462+
$($p $(if $pred)? => $fallback,)*
466463
}
467464
};
465+
// Turn $e into a block.
466+
($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
467+
$crate::downcast_primitive_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
468+
};
469+
// Remove $values parentheses.
470+
(($($values:ident),+) => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
471+
$crate::downcast_primitive_array!($($values),+ => $e $($p $(if $pred)? => $fallback,)*)
472+
};
473+
// Turn $e into a block & remove $values parentheses.
474+
(($($values:ident),+) => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
475+
$crate::downcast_primitive_array!($($values),+ => {$e} $($p $(if $pred)? => $fallback,)*)
476+
};
468477
}
469478

470479
/// Force downcast of an [`Array`], such as an [`ArrayRef`], to
@@ -546,19 +555,19 @@ macro_rules! downcast_dictionary_array_helper {
546555
/// [`DataType`]: arrow_schema::DataType
547556
#[macro_export]
548557
macro_rules! downcast_dictionary_array {
549-
($values:ident => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
550-
downcast_dictionary_array!($values => {$e} $($p $(if $pred)* => $fallback)*)
558+
($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
559+
downcast_dictionary_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
551560
};
552561

553-
($values:ident => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
562+
($values:ident => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
554563
match $values.data_type() {
555564
$crate::cast::__private::DataType::Dictionary(k, _) => {
556565
$crate::downcast_integer! {
557566
k.as_ref() => ($crate::downcast_dictionary_array_helper, $values, $e),
558567
k => unreachable!("unsupported dictionary key type: {}", k)
559568
}
560569
}
561-
$($p $(if $pred)* => $fallback,)*
570+
$($p $(if $pred)? => $fallback,)*
562571
}
563572
}
564573
}
@@ -654,19 +663,19 @@ macro_rules! downcast_run_array_helper {
654663
/// [`DataType`]: arrow_schema::DataType
655664
#[macro_export]
656665
macro_rules! downcast_run_array {
657-
($values:ident => $e:expr, $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
658-
downcast_run_array!($values => {$e} $($p $(if $pred)* => $fallback)*)
666+
($values:ident => $e:expr, $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
667+
downcast_run_array!($values => {$e} $($p $(if $pred)? => $fallback,)*)
659668
};
660669

661-
($values:ident => $e:block $($p:pat $(if $pred:expr)* => $fallback:expr $(,)*)*) => {
670+
($values:ident => $e:block $($p:pat $(if $pred:expr)? => $fallback:expr $(,)?)*) => {
662671
match $values.data_type() {
663672
$crate::cast::__private::DataType::RunEndEncoded(k, _) => {
664673
$crate::downcast_run_end_index! {
665674
k.data_type() => ($crate::downcast_run_array_helper, $values, $e),
666675
k => unreachable!("unsupported run end index type: {}", k)
667676
}
668677
}
669-
$($p $(if $pred)* => $fallback,)*
678+
$($p $(if $pred)? => $fallback,)*
670679
}
671680
}
672681
}

0 commit comments

Comments
 (0)