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

Represents a type-level false

Represents a type-level true

Traits

Represents a type-level bool

Type Definitions

Ands two Booleans

Negates a Boolean.

Ors two Booleans

Xors two Booleans