Skip to main content

type_sets/
generate_sets.rs

1#![allow(unused)]
2use super::*;
3use std::{any::TypeId, marker::PhantomData, sync::OnceLock};
4
5macro_rules! generate_sets {
6    ($(
7        for<$($el:ident),*> $n:literal $($true:literal)? = {
8            pub struct $struct:ident;
9
10            trait $trait:ident: $(
11                $sub_trait:ident <$($sub_el:ident),*>
12            ),* {}
13        }
14    )*) => {
15        // Trait definitions
16        mod _priv {
17            use super::*;
18            $(
19                /// A private trait that defines the set of types contained in a type set.
20                pub trait $trait<$($el),*>: $($sub_trait <$($sub_el),*> +)* {}
21            )*
22        }
23        pub(crate) use _priv::*;
24
25        // Struct definitions
26        $(
27            /// A [`TypeSet`] of `n` types.
28            ///
29            /// Look at the [`Set`] macro for a more convenient way to define type sets.
30            // pub struct $struct<$($el),*>(PhantomData<fn() -> ($($el),*)>);
31            pub(crate) type $struct<$($el),*> = ($($el,)*);
32        )*
33
34        // Subset implementations
35        $(
36            #[diagnostic::do_not_recommend]
37            impl<S: ?Sized, $($el),*> SubsetOf<S> for dyn $trait<$($el),*>
38                where S: $trait<$($el),*>
39            {}
40        )*
41
42        // TypeSet implementations
43        $(
44            #[diagnostic::do_not_recommend]
45            impl<$($el),*> TypeSet for $struct<$($el,)*>
46            {
47                type Set = dyn $trait<$($el),*>;
48
49                fn members() -> &'static [TypeId]
50                where
51                    Self: 'static,
52                {
53                    static MEMBERS: OnceLock<[TypeId; $n]> = OnceLock::new();
54                    MEMBERS.get_or_init(|| [$(
55                        TypeId::of::<$el>()
56                    ),*])
57                }
58            }
59        )*
60
61        // Contains for Subset implementations
62        $(
63            #[diagnostic::do_not_recommend]
64            impl<S: ?Sized, $($el),*> $trait<$($el),*> for S
65            where
66                S: TypeSet,
67                S::Set: $trait<$($el),*>
68            {}
69        )*
70    };
71}
72
73generate_sets! {
74    // Set0 / Contains0 is implemented manually below, because it has no constraints
75
76    for<E1> 1 = {
77        pub struct Set1;
78        trait Contains1: Contains0<> {}
79    }
80
81    for<E1, E2> 2 = {
82        pub struct Set2;
83        trait Contains2: Contains1<E1>, Contains1<E2> {}
84    }
85
86    for<E1, E2, E3> 3 = {
87        pub struct Set3;
88        trait Contains3: Contains2<E1, E2>, Contains1<E3> {}
89    }
90
91    for<E1, E2, E3, E4> 4 = {
92        pub struct Set4;
93        trait Contains4: Contains3<E1, E2, E3>, Contains1<E4> {}
94    }
95
96    for<E1, E2, E3, E4, E5> 5 = {
97        pub struct Set5;
98        trait Contains5: Contains4<E1, E2, E3, E4>, Contains1<E5> {}
99    }
100
101    for<E1, E2, E3, E4, E5, E6> 6 = {
102        pub struct Set6;
103        trait Contains6: Contains5<E1, E2, E3, E4, E5>, Contains1<E6> {}
104    }
105
106    for<E1, E2, E3, E4, E5, E6, E7> 7 = {
107        pub struct Set7;
108        trait Contains7: Contains6<E1, E2, E3, E4, E5, E6>, Contains1<E7> {}
109    }
110
111    for<E1, E2, E3, E4, E5, E6, E7, E8> 8 = {
112        pub struct Set8;
113        trait Contains8: Contains7<E1, E2, E3, E4, E5, E6, E7>, Contains1<E8> {}
114    }
115
116    for<E1, E2, E3, E4, E5, E6, E7, E8, E9> 9 = {
117        pub struct Set9;
118        trait Contains9: Contains8<E1, E2, E3, E4, E5, E6, E7, E8>, Contains1<E9> {}
119    }
120
121    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10> 10 = {
122        pub struct Set10;
123        trait Contains10: Contains9<E1, E2, E3, E4, E5, E6, E7, E8, E9>, Contains1<E10> {}
124    }
125
126    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11> 11 = {
127        pub struct Set11;
128        trait Contains11: Contains10<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10>, Contains1<E11> {}
129    }
130
131    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12> 12 = {
132        pub struct Set12;
133        trait Contains12: Contains11<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11>, Contains1<E12> {}
134    }
135
136    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13> 13 = {
137        pub struct Set13;
138        trait Contains13: Contains12<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12>, Contains1<E13> {}
139    }
140
141    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14> 14 = {
142        pub struct Set14;
143        trait Contains14: Contains13<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13>, Contains1<E14> {}
144    }
145
146    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15> 15 = {
147        pub struct Set15;
148        trait Contains15: Contains14<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14>, Contains1<E15> {}
149    }
150
151    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16> 16 = {
152        pub struct Set16;
153        trait Contains16: Contains15<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15>, Contains1<E16> {}
154    }
155
156    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17> 17 = {
157        pub struct Set17;
158        trait Contains17: Contains16<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16>, Contains1<E17> {}
159    }
160
161    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18> 18 = {
162        pub struct Set18;
163        trait Contains18: Contains17<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17>, Contains1<E18> {}
164    }
165
166    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19> 19 = {
167        pub struct Set19;
168        trait Contains19: Contains18<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18>, Contains1<E19> {}
169    }
170
171    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20> 20 = {
172        pub struct Set20;
173        trait Contains20: Contains19<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19>, Contains1<E20> {}
174    }
175
176    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21> 21 = {
177        pub struct Set21;
178        trait Contains21: Contains20<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20>, Contains1<E21> {}
179    }
180
181    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22> 22 = {
182        pub struct Set22;
183        trait Contains22: Contains21<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21>, Contains1<E22> {}
184    }
185
186    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23> 23 = {
187        pub struct Set23;
188        trait Contains23: Contains22<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22>, Contains1<E23> {}
189    }
190
191    for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23, E24> 24 = {
192        pub struct Set24;
193        trait Contains24: Contains23<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22, E23>, Contains1<E24> {}
194    }
195}
196
197mod _priv_0 {
198    pub trait Contains0 {}
199}
200pub(crate) use _priv_0::*;
201
202pub(crate) type Set0 = ();
203
204#[diagnostic::do_not_recommend]
205impl<S: ?Sized> SubsetOf<S> for dyn Contains0 {}
206
207#[diagnostic::do_not_recommend]
208impl<S: ?Sized> Contains0 for S {}
209
210impl TypeSet for Set0 {
211    type Set = dyn Contains0;
212
213    fn members() -> &'static [TypeId] {
214        &[]
215    }
216}