Skip to content

Commit 2ce9079

Browse files
authored
feat: gate 60 tuple impls behind 'more-tuple-impls' feature flag (#1027)
1 parent 6893986 commit 2ce9079

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed

crates/core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ rlp = ["alloy-primitives/rlp", "dep:alloy-rlp"]
7575
serde = ["alloy-primitives/serde"]
7676
k256 = ["alloy-primitives/k256"]
7777
eip712 = ["alloy-sol-types?/eip712-serde", "alloy-dyn-abi?/eip712"]
78+
more-tuple-impls = ["alloy-sol-types/more-tuple-impls"]
7879

7980
postgres = ["std", "alloy-primitives/postgres"]
8081
arbitrary = [

crates/sol-types/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,4 @@ std = ["alloy-primitives/std", "alloy-json-abi?/std", "serde?/std"]
5757
json = ["dep:alloy-json-abi", "alloy-sol-macro/json"]
5858
eip712-serde = ["dep:serde", "alloy-primitives/serde"]
5959
arbitrary = ["alloy-primitives/arbitrary"]
60+
more-tuple-impls = []

crates/sol-types/src/macros.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,65 @@
11
/// Calls the given macro with all the tuples.
22
#[rustfmt::skip]
3+
#[cfg(not(feature = "more-tuple-impls"))] // 24
4+
macro_rules! all_the_tuples {
5+
(@double $mac:path) => {
6+
$mac!( 1 (T1 U1));
7+
$mac!( 2 (T1 U1), (T2 U2));
8+
$mac!( 3 (T1 U1), (T2 U2), (T3 U3));
9+
$mac!( 4 (T1 U1), (T2 U2), (T3 U3), (T4 U4));
10+
$mac!( 5 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5));
11+
$mac!( 6 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6));
12+
$mac!( 7 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7));
13+
$mac!( 8 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8));
14+
$mac!( 9 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9));
15+
$mac!(10 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10));
16+
$mac!(11 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11));
17+
$mac!(12 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12));
18+
$mac!(13 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13));
19+
$mac!(14 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14));
20+
$mac!(15 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15));
21+
$mac!(16 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16));
22+
$mac!(17 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17));
23+
$mac!(18 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18));
24+
$mac!(19 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19));
25+
$mac!(20 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19), (T20 U20));
26+
$mac!(21 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19), (T20 U20), (T21 U21));
27+
$mac!(22 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19), (T20 U20), (T21 U21), (T22 U22));
28+
$mac!(23 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19), (T20 U20), (T21 U21), (T22 U22), (T23 U23));
29+
$mac!(24 (T1 U1), (T2 U2), (T3 U3), (T4 U4), (T5 U5), (T6 U6), (T7 U7), (T8 U8), (T9 U9), (T10 U10), (T11 U11), (T12 U12), (T13 U13), (T14 U14), (T15 U15), (T16 U16), (T17 U17), (T18 U18), (T19 U19), (T20 U20), (T21 U21), (T22 U22), (T23 U23), (T24 U24));
30+
};
31+
32+
($mac:path) => {
33+
$mac!( 1 T1);
34+
$mac!( 2 T1, T2);
35+
$mac!( 3 T1, T2, T3);
36+
$mac!( 4 T1, T2, T3, T4);
37+
$mac!( 5 T1, T2, T3, T4, T5);
38+
$mac!( 6 T1, T2, T3, T4, T5, T6);
39+
$mac!( 7 T1, T2, T3, T4, T5, T6, T7);
40+
$mac!( 8 T1, T2, T3, T4, T5, T6, T7, T8);
41+
$mac!( 9 T1, T2, T3, T4, T5, T6, T7, T8, T9);
42+
$mac!(10 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
43+
$mac!(11 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
44+
$mac!(12 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);
45+
$mac!(13 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13);
46+
$mac!(14 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14);
47+
$mac!(15 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15);
48+
$mac!(16 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16);
49+
$mac!(17 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17);
50+
$mac!(18 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18);
51+
$mac!(19 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19);
52+
$mac!(20 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20);
53+
$mac!(21 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21);
54+
$mac!(22 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22);
55+
$mac!(23 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23);
56+
$mac!(24 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24);
57+
};
58+
}
59+
60+
/// Calls the given macro with all the tuples.
61+
#[rustfmt::skip]
62+
#[cfg(feature = "more-tuple-impls")] // 60
363
macro_rules! all_the_tuples {
464
(@double $mac:path) => {
565
$mac!( 1 (T1 U1));

scripts/all_tuples.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Generate Rust's all_the_tuples macro with configurable N.
4+
"""
5+
6+
7+
def generate_tuple_list(n, double=False):
8+
"""Generate tuple list for a given n."""
9+
if double:
10+
return ", ".join(f"(T{i} U{i})" for i in range(1, n + 1))
11+
else:
12+
return ", ".join(f"T{i}" for i in range(1, n + 1))
13+
14+
15+
def generate_macro(max_n):
16+
"""Generate the complete all_the_tuples macro."""
17+
lines = [
18+
"/// Calls the given macro with all the tuples.",
19+
"#[rustfmt::skip]",
20+
"macro_rules! all_the_tuples {",
21+
" (@double $mac:path) => {",
22+
]
23+
24+
# Generate @double variant
25+
for i in range(1, max_n + 1):
26+
tuple_list = generate_tuple_list(i, double=True)
27+
lines.append(f" $mac!({i:2} {tuple_list});")
28+
29+
lines.append(" };")
30+
lines.append("")
31+
lines.append(" ($mac:path) => {")
32+
33+
# Generate single variant
34+
for i in range(1, max_n + 1):
35+
tuple_list = generate_tuple_list(i, double=False)
36+
lines.append(f" $mac!({i:2} {tuple_list});")
37+
38+
lines.append(" };")
39+
lines.append("}")
40+
lines.append("")
41+
42+
return "\n".join(lines)
43+
44+
45+
def main():
46+
import sys
47+
48+
if len(sys.argv) != 2:
49+
print("Usage: python all_tuples.py <N>")
50+
print("Example: python all_tuples.py 60")
51+
sys.exit(1)
52+
53+
try:
54+
n = int(sys.argv[1])
55+
if n <= 0:
56+
raise ValueError("N must be positive")
57+
except ValueError as e:
58+
print(f"Error: {e}")
59+
print("N must be a positive integer")
60+
sys.exit(1)
61+
62+
macro_code = generate_macro(n)
63+
print(macro_code)
64+
65+
66+
if __name__ == "__main__":
67+
main()

0 commit comments

Comments
 (0)