Function core_extensions::utils::impossible

source ·
pub unsafe fn impossible() -> !
Expand description

Use this function to mark to the compiler that this branch is impossible.

This function panics when debug assertions are enabled, if debug assertions are disabled then reaching this is undefined behaviour.

For a version which doesn’t panic in debug builds but instead always causes undefined behaviour when reached you can use std::hint::unreachable_unchecked.

§Safety

It is undefined behaviour for this function to be reached at runtime at all.

The compiler is free to delete any code that reaches and depends on this function, on the assumption that this branch can’t be reached.

§Example

use core_extensions::BoolExt;
use core_extensions::utils::impossible;

mod non_zero{
   use super::*;
   #[derive(Debug,Copy,Clone)]
   pub struct NonZero(usize);

   impl NonZero{
       pub fn new(value:usize) -> Option<NonZero> {
           (value!=0).if_true(|| NonZero(value))
       }
       pub fn value(&self)->usize{
           self.0
       }
   }
}
use self::non_zero::NonZero;


fn div(numerator: usize, denom: Option<NonZero>) -> usize{
   let denom = match denom {
       Some(v) if v.value() == 0 => unsafe{
           // unreachable: NonZero::value() can never be 0,
           impossible()
       },
       Some(v) => v.value(),
       None => 1,
   };
   numerator / denom
}

assert_eq!(div(60, NonZero::new(0)), 60);
assert_eq!(div(60, NonZero::new(1)), 60);
assert_eq!(div(60, NonZero::new(2)), 30);
assert_eq!(div(60, NonZero::new(3)), 20);
assert_eq!(div(60, NonZero::new(4)), 15);
assert_eq!(div(60, NonZero::new(5)), 12);
assert_eq!(div(60, NonZero::new(6)), 10);