Crates.io | type-equals |
lib.rs | type-equals |
version | 0.1.0 |
source | src |
created_at | 2020-02-01 19:05:18.00718 |
updated_at | 2020-02-01 19:05:18.00718 |
description | Type equality trait for rust-lang/rust#20041 |
homepage | https://github.com/SOF3/type-equals |
repository | https://github.com/SOF3/type-equals |
max_upload_size | |
id | 203993 |
size | 6,365 |
A trait for checking type equality.
This crate implements the TypeEquals trick described in rust-lang/rust#20041.
The following compiles:
use type_equals::TypeEquals;
pub trait Owner {
type Child1: Child;
type Child2: Child;
}
pub trait Child {
type Owner: Owner;
}
pub struct A;
impl Owner for A {
type Child1 = B;
type Child2 = C;
}
pub struct B;
impl Child for B {
type Owner = A;
}
pub struct C;
impl Child for C {
type Owner = A;
}
pub fn want_child_one<T: Child>()
where
<T::Owner as Owner>::Child1: TypeEquals<Other = T>,
{}
pub fn want_child_two<T: Child>()
where
<T::Owner as Owner>::Child2: TypeEquals<Other = T>,
{}
pub fn this_works() {
want_child_one::<B>();
want_child_two::<C>();
}
Meanwhile, the following does not compile:
// A, B, C, want_child_one and want_child_two are declared identically.
pub fn this_does_not_work() {
want_child_one::<C>();
want_child_two::<B>();
}