Module core_extensions::type_level_bool
source · [−]Available on crate feature
type_level_bool
only.Expand description
Type level booleans
Example
Access of privileges based on renamed Boolean types.
use std::mem;
use std::marker::PhantomData;
use core_extensions::CovariantPhantom;
pub use core_extensions::type_level_bool::{
Boolean as PrivilegeLevel,
False as Unprivileged,
True as Privileged,
};
#[repr(C)]
#[derive(Debug)]
struct User<P>{
name: String,
privilege_level: CovariantPhantom<P>,
}
impl<P: PrivilegeLevel> User<P>{
fn new(name: String, privilege_level: P) -> Self {
Self{name, privilege_level: PhantomData}
}
fn name(&self)->&str{
&self.name
}
fn into_unprivileged(self) -> User<Unprivileged> {
User{name: self.name, privilege_level: PhantomData}
}
fn as_unprivileged(self: &mut User<P>) -> &mut User<Unprivileged> {
// Only the type parameter P changes here
unsafe{ mem::transmute(self) }
}
}
impl User<Privileged>{
fn set_name(&mut self, name: String){
self.name = name;
}
}
let mut user: User<Privileged> = User::new("bob".into(), Privileged);
assert_eq!(user.name(), "bob");
user.set_name("paul".into());
assert_eq!(user.name(), "paul");
{
let user: &mut User<Unprivileged> = user.as_unprivileged();
// Unprivileged Users can't change their name.
// user.set_name("james".into());
assert_eq!(user.name(), "paul");
}
user.set_name("john".into());
assert_eq!(user.name(), "john");
Structs
Traits
Represents a type-level bool