dungeon_cell/bound/
subset.rs

1use crate::marker_traits::IsBound;
2
3use super::{traits, Bound};
4
5/// Check if dynamic trait bound is a subset of another dynamic trait bound.
6///
7/// A dynamic trait bound is a subset of another if it requres less of the bounded type.
8///
9/// For example, `T: Send` is a subset of `T: Send + Sync`.
10///
11/// This trait is [sealed](https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed)
12/// and cannot be implemented outside of the implementations here.
13///
14/// # Examples
15/// ```
16/// use dungeon_cell::bound::{Subset, bounds};
17/// use dungeon_cell::marker_traits::IsBound;
18///
19/// fn test<A: Subset<B> + IsBound, B: IsBound>() {}
20///
21/// test::<bounds::Empty, bounds::Copy>();
22/// test::<bounds::Send, bounds::Normal>();
23/// test::<bounds::Normal, bounds::Normal>();
24/// ```
25/// ```compile_fail
26/// use dungeon_cell::bound::{Subset, bounds};
27/// use dungeon_cell::marker_traits::IsBound;
28///
29/// fn test<A: Subset<B> + IsBound, B: IsBound>() {}
30///
31/// // only the Empty bound is a subset of the Empty bound
32/// test::<bounds::Copy, bounds::Empty>();
33/// ```
34pub trait Subset<T: IsBound>: IsBound {}
35
36impl<
37        SendLarger,
38        SyncLarger,
39        CopyLarger,
40        CloneLarger,
41        UnpinLarger,
42        DebugLarger,
43        SendSmaller,
44        SyncSmaller,
45        CopySmaller,
46        CloneSmaller,
47        UnpinSmaller,
48        DebugSmaller,
49    >
50    Subset<
51        Bound<
52            SendLarger,
53            SyncLarger,
54            CopyLarger,
55            CloneLarger,
56            UnpinLarger,
57            DebugLarger,
58        >,
59    >
60    for Bound<
61        SendSmaller,
62        SyncSmaller,
63        CopySmaller,
64        CloneSmaller,
65        UnpinSmaller,
66        DebugSmaller,
67    >
68where
69    Bound<
70        SendLarger,
71        SyncLarger,
72        CopyLarger,
73        CloneLarger,
74        UnpinLarger,
75        DebugLarger,
76    >: IsBound,
77    Bound<
78        SendSmaller,
79        SyncSmaller,
80        CopySmaller,
81        CloneSmaller,
82        UnpinSmaller,
83        DebugSmaller,
84    >: IsBound,
85    SendSmaller: SubsetHelper<SendLarger>,
86    SyncSmaller: SubsetHelper<SyncLarger>,
87    CopySmaller: SubsetHelper<CopyLarger>,
88    CloneSmaller: SubsetHelper<CloneLarger>,
89    UnpinSmaller: SubsetHelper<UnpinLarger>,
90    DebugSmaller: SubsetHelper<DebugLarger>,
91{
92}
93
94pub trait SubsetHelper<T> {}
95
96impl SubsetHelper<traits::Send> for traits::__ {}
97impl SubsetHelper<traits::Sync> for traits::__ {}
98impl SubsetHelper<traits::Copy> for traits::__ {}
99impl SubsetHelper<traits::Clone> for traits::__ {}
100impl SubsetHelper<traits::Unpin> for traits::__ {}
101impl SubsetHelper<traits::Debug> for traits::__ {}
102impl SubsetHelper<traits::__> for traits::__ {}
103
104impl SubsetHelper<traits::Send> for traits::Send {}
105impl SubsetHelper<traits::Sync> for traits::Sync {}
106impl SubsetHelper<traits::Copy> for traits::Copy {}
107impl SubsetHelper<traits::Clone> for traits::Clone {}
108impl SubsetHelper<traits::Unpin> for traits::Unpin {}
109impl SubsetHelper<traits::Debug> for traits::Debug {}