#const-generics #variant #compile #compile-time #value #options #whether

const-either

编译时已知变体的 Option 和 Either 类型

2 个版本

0.1.1 2022年5月5日
0.1.0 2022年5月2日

#20#whether

MIT 许可证

10KB
149 行代码(不含注释)

Const Either

一些类型,允许在编译时判断一个选项是否包含值或哪个 Either 类型的变体处于活动状态。这可能在你有一些需要决定是否使用一个数据结构或另一个数据结构,或完全不使用数据结构的 const 泛型类型时非常有用。

语法

let _definetly_none = ConstOption::<String, false>::new();
let definetly_some = ConstOption::<String, true>::new("hello, world".to_string());

// When there is definitely some value, the deref trait can be used.
println!("{}", &*definitely_some);

// Obtain the string inside.
let contained_string = definitely_some.into_inner();


struct Container<T, const IS_UNIQUE: bool> {
    data: ConstEither<Vec<T>, HashSet<T>, UNIQUE>,
}

impl<T> Container<T, false> {
    fn insert(&mut self, val: T) {
        /* ... */
    }
}

impl<T: Eq + Hash> Container<T, true> {
    fn insert(&mut self, val: T) -> Result<(), T> {
        /* ... */
    }
}

缺点

由于 Rust 的当前状态,类型 ConstEither<L, R> 的大小和对齐将取决于 L 和 R 中的最大者

无运行时依赖