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 mod _priv {
17 use super::*;
18 $(
19 pub trait $trait<$($el),*>: $($sub_trait <$($sub_el),*> +)* {}
21 )*
22 }
23 pub(crate) use _priv::*;
24
25 $(
27 pub(crate) type $struct<$($el),*> = ($($el,)*);
32 )*
33
34 $(
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 $(
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 $(
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 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}