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 pub(crate) 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 #[diagnostic::do_not_recommend]
28 impl<S: ?Sized, $($el),*> SubsetOf<S> for dyn $trait<$($el),*>
29 where S: $(
31 Contains1<$el> +
32 )*
33 {}
34 )*
35
36 $(
38 #[diagnostic::do_not_recommend]
39 impl<$($el),*> TypeSet for ($($el,)*)
40 {
41 type Set = dyn $trait<$($el),*>;
42
43 fn members() -> &'static [TypeId]
44 where
45 Self: 'static,
46 {
47 static MEMBERS: OnceLock<[TypeId; $n]> = OnceLock::new();
48 MEMBERS.get_or_init(|| [$(
49 TypeId::of::<$el>()
50 ),*])
51 }
52 }
53 )*
54
55 $(
57 #[diagnostic::do_not_recommend]
58 impl<S: ?Sized, $($el),*> $trait<$($el),*> for S
59 where
60 S: TypeSet,
61 S::Set: $trait<$($el),*>
62 {}
63 )*
64 };
65}
66
67generate_sets! {
68 for<E1> 1 = {
71 pub struct Set1;
72 trait Contains1: Contains0<> {}
73 }
74
75 for<E1, E2> 2 = {
76 pub struct Set2;
77 trait Contains2: Contains1<E1>, Contains1<E2> {}
78 }
79
80 for<E1, E2, E3> 3 = {
81 pub struct Set3;
82 trait Contains3: Contains2<E1, E2>, Contains1<E3> {}
83 }
84
85 for<E1, E2, E3, E4> 4 = {
86 pub struct Set4;
87 trait Contains4: Contains3<E1, E2, E3>, Contains1<E4> {}
88 }
89
90 for<E1, E2, E3, E4, E5> 5 = {
91 pub struct Set5;
92 trait Contains5: Contains4<E1, E2, E3, E4>, Contains1<E5> {}
93 }
94
95 for<E1, E2, E3, E4, E5, E6> 6 = {
96 pub struct Set6;
97 trait Contains6: Contains5<E1, E2, E3, E4, E5>, Contains1<E6> {}
98 }
99
100 for<E1, E2, E3, E4, E5, E6, E7> 7 = {
101 pub struct Set7;
102 trait Contains7: Contains6<E1, E2, E3, E4, E5, E6>, Contains1<E7> {}
103 }
104
105 for<E1, E2, E3, E4, E5, E6, E7, E8> 8 = {
106 pub struct Set8;
107 trait Contains8: Contains7<E1, E2, E3, E4, E5, E6, E7>, Contains1<E8> {}
108 }
109
110 for<E1, E2, E3, E4, E5, E6, E7, E8, E9> 9 = {
111 pub struct Set9;
112 trait Contains9: Contains8<E1, E2, E3, E4, E5, E6, E7, E8>, Contains1<E9> {}
113 }
114
115 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10> 10 = {
116 pub struct Set10;
117 trait Contains10: Contains9<E1, E2, E3, E4, E5, E6, E7, E8, E9>, Contains1<E10> {}
118 }
119
120 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11> 11 = {
121 pub struct Set11;
122 trait Contains11: Contains10<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10>, Contains1<E11> {}
123 }
124
125 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12> 12 = {
126 pub struct Set12;
127 trait Contains12: Contains11<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11>, Contains1<E12> {}
128 }
129
130 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13> 13 = {
131 pub struct Set13;
132 trait Contains13: Contains12<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12>, Contains1<E13> {}
133 }
134
135 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14> 14 = {
136 pub struct Set14;
137 trait Contains14: Contains13<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13>, Contains1<E14> {}
138 }
139
140 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15> 15 = {
141 pub struct Set15;
142 trait Contains15: Contains14<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14>, Contains1<E15> {}
143 }
144
145 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16> 16 = {
146 pub struct Set16;
147 trait Contains16: Contains15<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15>, Contains1<E16> {}
148 }
149
150 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17> 17 = {
151 pub struct Set17;
152 trait Contains17: Contains16<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16>, Contains1<E17> {}
153 }
154
155 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18> 18 = {
156 pub struct Set18;
157 trait Contains18: Contains17<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17>, Contains1<E18> {}
158 }
159
160 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19> 19 = {
161 pub struct Set19;
162 trait Contains19: Contains18<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18>, Contains1<E19> {}
163 }
164
165 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20> 20 = {
166 pub struct Set20;
167 trait Contains20: Contains19<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19>, Contains1<E20> {}
168 }
169
170 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21> 21 = {
171 pub struct Set21;
172 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> {}
173 }
174
175 for<E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11, E12, E13, E14, E15, E16, E17, E18, E19, E20, E21, E22> 22 = {
176 pub struct Set22;
177 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> {}
178 }
179
180 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 = {
181 pub struct Set23;
182 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> {}
183 }
184
185 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 = {
186 pub struct Set24;
187 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> {}
188 }
189}
190
191mod _priv_0 {
192 pub trait Contains0 {}
193}
194pub(crate) use _priv_0::*;
195
196pub(crate) type Set0 = ();
197
198#[diagnostic::do_not_recommend]
199impl<S: ?Sized> SubsetOf<S> for dyn Contains0 {}
200
201#[diagnostic::do_not_recommend]
202impl<S: ?Sized> Contains0 for S {}
203
204impl TypeSet for Set0 {
205 type Set = dyn Contains0;
206
207 fn members() -> &'static [TypeId] {
208 &[]
209 }
210}
211
212#[cfg(test)]
213mod test {
214 use super::*;
215
216 fn is_superset<T: ?Sized, R: ?Sized>()
217 where
218 T: SupersetOf<R>,
219 {
220 }
221
222 fn is_subset<T: ?Sized, R: ?Sized>()
223 where
224 T: SubsetOf<R>,
225 {
226 }
227
228 fn test() {
229 is_subset::<dyn Contains3<u8, u16, u32>, dyn Contains4<u8, u16, u64, u32>>();
230
231 is_subset::<(u8, u32), (u8, u16, u64, u32)>();
232 }
233}