/// Asserts that the trait is a child of all of the other traits. /// /// Related: /// - [`assert_trait_super_all!`] /// /// # Examples /// /// All types that implement [`Copy`] must implement [`Clone`]: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_all!(Copy: Clone); /// ``` /// /// All types that implement [`Ord`] must implement [`PartialEq`], [`Eq`], and /// [`PartialOrd`]: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_all!(Ord: PartialEq, Eq, PartialOrd); /// ``` /// /// The following example fails to compile because [`Eq`] is not required for /// [`PartialOrd`]: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_all!(PartialOrd: Eq); /// ``` /// /// [`assert_trait_super_all!`]: macro.assert_trait_super_all.html /// /// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html /// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html /// [`Ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html /// [`PartialOrd`]: https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html /// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html #[macro_export(local_inner_macros)] macro_rules! assert_trait_sub_all { ($sub:path: $($super:path),+ $(,)?) => { assert_impl!(for(T: $sub) T: $( ($super) )&+); }; } /// Asserts that the trait is a parent of all of the other traits. /// /// Related: /// - [`assert_trait_sub_all!`] /// /// # Examples /// /// With this, traits `A` and `B` can both be tested to require [`Copy`] on a /// single line: /// /// ``` /// # use static_assertions::assert_trait_super_all; /// trait A: Copy {} /// trait B: Copy {} /// /// assert_trait_super_all!(Copy: A, B); /// ``` /// /// Otherwise, each sub-trait would require its own call to /// [`assert_trait_sub_all!`]: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// # trait A: Copy {} /// # trait B: Copy {} /// assert_trait_sub_all!(A: Copy); /// assert_trait_sub_all!(B: Copy); /// ``` /// /// The following example fails to compile because trait `C` does not require /// [`Copy`]: /// /// ```compile_fail /// # use static_assertions::assert_trait_super_all; /// # trait A: Copy {} /// # trait B: Copy {} /// trait C {} /// /// assert_trait_super_all!(Copy: A, B, C); /// ``` /// /// [`assert_trait_sub_all!`]: macro.assert_trait_sub_all.html /// /// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html #[macro_export(local_inner_macros)] macro_rules! assert_trait_super_all { ($super:path: $($sub:path),+ $(,)?) => { $(assert_trait_sub_all!($sub: $super);)+ }; } /// Asserts that the trait is a child of one or more of the other traits. /// /// Related: /// - [`assert_impl_any!`] /// /// # Examples /// /// All types that implement [`Copy`] must implement [`Clone`]: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_any!(Copy: Clone); /// ``` /// /// All types that implement [`Ord`] must implement [`Eq`], but don't have to implement [`Clone`]: /// /// ``` /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_any!(Ord: Eq, Clone); /// ``` /// /// The following example fails to compile because neither [`Eq`] nor [`Clone`] are required for /// [`PartialOrd`]: /// /// ```compile_fail /// # #[macro_use] extern crate static_assertions; fn main() {} /// assert_trait_sub_any!(PartialOrd: Eq, Clone); /// ``` /// /// [`assert_impl_any!`]: macro.assert_impl_any.html /// /// [`Copy`]: https://doc.rust-lang.org/std/marker/trait.Copy.html /// [`Clone`]: https://doc.rust-lang.org/std/clone/trait.Clone.html /// [`Ord`]: https://doc.rust-lang.org/std/cmp/trait.Ord.html /// [`PartialOrd`]: https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html /// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html #[macro_export(local_inner_macros)] macro_rules! assert_trait_sub_any { ($sub:path: $($super:path),+ $(,)?) => { assert_impl!(for(T: $sub) T: $( ($super) )|+); }; }