repr_offset/
privacy.rs
1#[derive(Debug, Copy, Clone)]
5pub struct IsPublic;
6
7#[derive(Debug, Copy, Clone)]
9pub struct IsPrivate;
10
11mod sealed {
12 use super::{IsPrivate, IsPublic};
13 pub trait Sealed {}
14
15 impl Sealed for IsPublic {}
16 impl Sealed for IsPrivate {}
17}
18use self::sealed::Sealed;
19
20pub trait Privacy: Sealed {}
27
28impl Privacy for IsPublic {}
29impl Privacy for IsPrivate {}
30
31pub type CombinePrivacyOut<Lhs, Rhs> = <Lhs as CombinePrivacy<Rhs>>::Output;
38
39pub trait CombinePrivacy<Rhs: Privacy> {
43 type Output: Privacy;
50}
51
52impl<A: Privacy> CombinePrivacy<A> for IsPublic {
53 type Output = A;
54}
55impl<A: Privacy> CombinePrivacy<A> for IsPrivate {
56 type Output = IsPrivate;
57}
58
59macro_rules! tuple_impls {
60 (small=> $ty:ty = $output:ty) => {
61 impl<Carry: Privacy> CombinePrivacy<Carry> for $ty {
62 type Output = $output;
63 }
64 };
65 (large=>
66 $( ($t0:ident,$t1:ident,$t2:ident,$t3:ident,), )*
67 $($trailing:ident,)*
68 )=>{
69 #[allow(non_camel_case_types)]
70 impl<A: Privacy, $($t0,$t1,$t2,$t3,)* $($trailing,)* CombTuples >
71 CombinePrivacy<A>
72 for ($($t0,$t1,$t2,$t3,)* $($trailing,)*)
73 where
74 ($($trailing,)*): CombinePrivacy<A>,
75 $( ($t0,$t1,$t2,$t3): CombinePrivacy<IsPublic>, )*
76 (
77 $( CombinePrivacyOut<($t0,$t1,$t2,$t3), IsPublic>, )*
78 ):CombinePrivacy<
79 CombinePrivacyOut<($($trailing,)*), A>,
80 Output = CombTuples,
81 >,
82 CombTuples: Privacy,
83 {
84 type Output = CombTuples;
85 }
86 };
87}
88
89impl_all_trait_for_tuples! {
90 macro = tuple_impls,
91 true = IsPublic,
92 false = IsPrivate,
93}