1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//! Simple trait for helping along upcasting of dyn supertraits.
//!
//! ```
//! # use upcast::{Upcast, UpcastFrom};
//! pub trait A {}
//! pub trait B: A + Upcast<dyn A> {}
//!
//! // Put this in your library
//! impl<'a, T: A + 'a> UpcastFrom<T> for dyn A + 'a {
//! fn up_from(value: &T) -> &(dyn A + 'a) { value }
//! fn up_from_mut(value: &mut T) -> &mut (dyn A + 'a) { value }
//! }
//!
//! // Now your users can do an upcast if needed, or you can within implementations
//! fn do_cast(b: &dyn B) -> &dyn A {
//! b.up()
//! }
//! ```
/// Implement this trait for your `dyn Trait` types for all `T: Trait`
/// Use this trait to perform your upcasts on dyn traits. Make sure to require it in the supertrait!