[−][src]Trait core_extensions::TypeIdentity
Allows converting Self
to
Self::Type
by proving that both types are equal.
For extension methods of types,
either generic (Vec<T>
) or fully concrete (str
),
to avoid repeating method and function signatures in both the trait and the impl block.
To create a type Alias in a where clause ,eg:Vec<i32>:TypeIdentity<Type=List>
.
To unwrap a generic type ,eg:I:TypeIdentity<Type=Option<U>>
.
Example
Defining an extension trait on Vec
use core_extensions::TypeIdentity; trait VecExt<T>:TypeIdentity<Type=Vec<T>>{ fn is_nonempty(&self)->bool{ !self.into_type_ref().is_empty() } fn moved_vec(self)->Vec<T> where Self:Sized { self.into_type_val() } fn mutable_vec(&mut self)->&mut Vec<T>{ self.into_type_mut() } } impl<T> VecExt<T> for Vec<T> {} assert!( vec![100].is_nonempty() ); assert!( !Vec::<i32>::new().is_nonempty() );
Example of a method requiring Self==Other
Wrapper::iter is only callable on Wrapper<Vec<T>>
use core_extensions::TypeIdentity; use std::slice; struct Wrapper<U>(U); impl<U> Wrapper<U>{ fn iter<T>(&self)->slice::Iter<T> where U:TypeIdentity<Type=Vec<T>> { self.0.into_type_ref().iter() } } assert_eq!( Wrapper(vec![0,1,2,3,4]).iter().cloned().collect::<Vec<_>>() , vec![0,1,2,3,4] );
Example of creating a type alias in a where clause
use core_extensions::TypeIdentity; use std::ops::Deref; struct Example<T>(T); impl<T,Target0,Target1> Deref for Example<T> where T:Deref, <T as Deref>::Target:TypeIdentity<Type=Target0>, Target0:Deref, <Target0 as Deref>::Target:TypeIdentity<Type=Target1>, { type Target=Target1; fn deref(&self)->&Target1{ &**self } }
Associated Types
type Type: ?Sized
The same type as Self.
Used in bounds to require that a generic type is a particular type.
Provided methods
fn into_type_val(self) -> Self::Type where
Self: Sized,
Self::Type: Sized,
Self: Sized,
Self::Type: Sized,
Converts a value back to the original type.
fn into_type_ref(&self) -> &Self::Type
Converts a reference back to the original type.
fn into_type_mut(&mut self) -> &mut Self::Type
Converts a mutable reference back to the original type.
fn into_type_box(self: Box<Self>) -> Box<Self::Type>
Converts a box back to the original type.
fn into_type_arc(this: Arc<Self>) -> Arc<Self::Type>
Converts an Arc back to the original type.
fn into_type_rc(this: Rc<Self>) -> Rc<Self::Type>
Converts an Rc back to the original type.
fn from_type_val(this: Self::Type) -> Self where
Self: Sized,
Self::Type: Sized,
Self: Sized,
Self::Type: Sized,
Converts a value back to the original type.
fn from_type_ref(this: &Self::Type) -> &Self
Converts a reference back to the original type.
fn from_type_mut(this: &mut Self::Type) -> &mut Self
Converts a mutable reference back to the original type.
fn from_type_box(this: Box<Self::Type>) -> Box<Self>
Converts a box back to the original type.
fn from_type_arc(this: Arc<Self::Type>) -> Arc<Self>
Converts an Arc back to the original type.
fn from_type_rc(this: Rc<Self::Type>) -> Rc<Self>
Converts an Rc back to the original type.