Skip to main content

Crate const_exhaustive

Crate const_exhaustive 

Source
Expand description

§const-exhaustive

crates.io docs.rs

Enumerate all values of a type at compile time.

§Features

  • All values of T: Exhaustive are stored in a GenericArray - allowing you to access all values at compile time, and in a const context.

  • Composable with core types - supports [T; N], tuples up to arity 16, Option<T>, and other types in core.

  • #[derive(Exhaustive)] - to implement it on your own types.

  • #![no_std] and no alloc - you can use it anywhere.

§Examples

use const_exhaustive::Exhaustive;

// there is 1 value of `()`
assert_eq!([()], <()>::ALL.as_slice());

// there are 2 values of `bool`
assert_eq!([false, true], bool::ALL.as_slice());

// works on types with generics
assert_eq!(
    [None, Some(false), Some(true)],
    Option::<bool>::ALL.as_slice()
);

// write your own exhaustive types
#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
enum Direction {
    North,
    South,
    East,
    West,
}

assert_eq!(
    [
        Direction::North,
        Direction::South,
        Direction::East,
        Direction::West,
    ],
    Direction::ALL.as_slice()
);

// works on arbitrarily complex types
#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
enum Complex {
    Direction(Direction),
    More {
        foo: Option<bool>,
        bar: (Result<Direction, [bool; 4]>),
    },
}

// works with generics*
#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
struct Wrapper<T>(T);

#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
struct DirectionSet<T> {
    pub north: T,
    pub south: T,
    pub east: T,
    pub west: T,
}

#[derive(Debug, Clone, Copy, PartialEq, Exhaustive)]
enum ForDirection<T> {
    North(T),
    South(T),
    East(T),
    West(T)
}

§Testing

This project uses just as the command runner.

Run quick checks:

just check

Run full tests, including Miri tests on nightly:

just test

Re-exports§

pub use generic_array;
pub use typenum;

Traits§

Exhaustive
All values of this type are known at compile time.

Derive Macros§

Exhaustive
Derives const_exhaustive::Exhaustive on this type.