1/// Asserts that the trait is a child of all of the other traits. 2/// 3/// Related: 4/// - [`assert_trait_super_all!`] 5/// 6/// # Examples 7/// 8/// All types that implement [`Copy`] must implement [`Clone`]: 9/// 10/// ``` 11/// # #[macro_use] extern crate static_assertions; fn main() {} 12/// assert_trait_sub_all!(Copy: Clone); 13/// ``` 14/// 15/// All types that implement [`Ord`] must implement [`PartialEq`], [`Eq`], and 16/// [`PartialOrd`]: 17/// 18/// ``` 19/// # #[macro_use] extern crate static_assertions; fn main() {} 20/// assert_trait_sub_all!(Ord: PartialEq, Eq, PartialOrd); 21/// ``` 22/// 23/// The following example fails to compile because [`Eq`] is not required for 24/// [`PartialOrd`]: 25/// 26/// ```compile_fail 27/// # #[macro_use] extern crate static_assertions; fn main() {} 28/// assert_trait_sub_all!(PartialOrd: Eq); 29/// ``` 30/// 31/// [`assert_trait_super_all!`]: macro.assert_trait_super_all.html 32/// 33/// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html 34/// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html 35/// [`Ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html 36/// [`PartialOrd`]: https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html 37/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html 38/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html 39#[macro_export] 40macro_rules! assert_trait_sub_all { 41 ($sub:path: $($super:path),+ $(,)?) => { 42 const _: () = { 43 // One scope per super-trait. 44 $({ 45 #[allow(non_camel_case_types)] 46 trait __Impl_Implication: $super {} 47 48 // Can only be implemented for `$sub` types if `$super` is 49 // also implemented. 50 impl<T: $sub> __Impl_Implication for T {} 51 })+ 52 }; 53 }; 54} 55 56/// Asserts that the trait is a parent of all of the other traits. 57/// 58/// Related: 59/// - [`assert_trait_sub_all!`] 60/// 61/// # Examples 62/// 63/// With this, traits `A` and `B` can both be tested to require [`Copy`] on a 64/// single line: 65/// 66/// ``` 67/// # use static_assertions::assert_trait_super_all; 68/// trait A: Copy {} 69/// trait B: Copy {} 70/// 71/// assert_trait_super_all!(Copy: A, B); 72/// ``` 73/// 74/// Otherwise, each sub-trait would require its own call to 75/// [`assert_trait_sub_all!`]: 76/// 77/// ``` 78/// # #[macro_use] extern crate static_assertions; fn main() {} 79/// # trait A: Copy {} 80/// # trait B: Copy {} 81/// assert_trait_sub_all!(A: Copy); 82/// assert_trait_sub_all!(B: Copy); 83/// ``` 84/// 85/// The following example fails to compile because trait `C` does not require 86/// [`Copy`]: 87/// 88/// ```compile_fail 89/// # use static_assertions::assert_trait_super_all; 90/// # trait A: Copy {} 91/// # trait B: Copy {} 92/// trait C {} 93/// 94/// assert_trait_super_all!(Copy: A, B, C); 95/// ``` 96/// 97/// [`assert_trait_sub_all!`]: macro.assert_trait_sub_all.html 98/// 99/// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html 100#[macro_export(local_inner_macros)] 101macro_rules! assert_trait_super_all { 102 ($super:path: $($sub:path),+ $(,)?) => { 103 $(assert_trait_sub_all!($sub: $super);)+ 104 }; 105} 106