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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
//!# typed //! //! Type annotation to help rustc. //! This is useful for code generation. //! //!# Usage //! //!This does not work without ufcs, because it's ambiguous. //! //!```rust //!trait ChangeWatcher<T> { //! fn is_changed(&self) -> bool; //!} //! //!struct DbConfig; //!struct AppConfig; //! //!struct Context; //! //!impl ChangeWatcher<DbConfig> for Context { //! fn is_changed(&self) -> bool { false } //!} //!impl ChangeWatcher<AppConfig> for Context { //! fn is_changed(&self) -> bool { false } //!} //! //! //! //!fn some<C: ChangeWatcher<DbConfig> + ChangeWatcher<AppConfig>>(c: C) { //! if <C as ChangeWatcher<DbConfig>>::is_changed(&c) { //! //! } //!} //! //!``` //! //! But this works. //! //!```rust //!extern crate typed; //!use typed::{Type, type_of}; //! //! //!trait ChangeWatcher<T> { //! fn is_changed(&self, _: Type<T>) -> bool; //!} //! //!struct DbConfig; //!struct AppConfig; //! //!struct Context; //! //!impl ChangeWatcher<DbConfig> for Context { //! fn is_changed(&self, _: Type<DbConfig>) -> bool { false } //!} //!impl ChangeWatcher<AppConfig> for Context { //! fn is_changed(&self, _: Type<AppConfig>) -> bool { false } //!} //! //! //!fn some<C: ChangeWatcher<DbConfig> + ChangeWatcher<AppConfig>>(c: C) { //! if c.is_changed(type_of::<DbConfig>()) { //! //! } //!} //! //!# fn main(){} //!``` //! use std::marker::PhantomData; pub struct Type<T: ?Sized>(PhantomData<T>); pub fn type_of<T: ?Sized>() -> Type<T> { Type(PhantomData) } pub fn type_of_val<T: ?Sized>(_: &T) -> Type<T> { Type(PhantomData) }