58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
|
//@ known-bug: #116519
|
||
|
#![allow(incomplete_features)]
|
||
|
#![feature(generic_const_exprs)]
|
||
|
trait Ret {
|
||
|
type R;
|
||
|
}
|
||
|
struct Cond<const PRED: bool, U, V>(std::marker::PhantomData<U>, std::marker::PhantomData<V>);
|
||
|
impl<U, V> Ret for Cond<true, U, V> {
|
||
|
type R = U;
|
||
|
}
|
||
|
impl<U, V> Ret for Cond<false, U, V> {
|
||
|
type R = V;
|
||
|
}
|
||
|
struct RobinHashTable<
|
||
|
const MAX_LENGTH: usize,
|
||
|
CellIdx = <Cond<{ MAX_LENGTH < 65535 }, u16, u32> as Ret>::R,
|
||
|
> {
|
||
|
_idx: CellIdx,
|
||
|
}
|
||
|
impl<CellIdx> RobinHashTable<MAX_LENGTH, CellIdx> {
|
||
|
fn new() -> Self {
|
||
|
Self {
|
||
|
_idx: CellIdx { MAX_LENGTH },
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
impl<CellIdx> HashMapBase<CellIdx> {
|
||
|
fn new() -> Self {
|
||
|
Self {
|
||
|
_idx: CellIdx { 0 },
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
impl<CellIdx> HashMapBase<CellIdx> for RobinHashTable<MAX_LENGTH, CellIdx> {
|
||
|
fn hash<H: Hash + Hasher>(&self,
|
||
|
|
||
|
) -> H {
|
||
|
self._idx.hash()
|
||
|
}
|
||
|
fn eq(&self, other: &Self) -> bool {
|
||
|
self._idx.eq(other._idx)
|
||
|
}
|
||
|
}
|
||
|
impl<CellIdx> HashMapBase<CellIdx> for RobinHashTable<MAX_LENGTH, CellIdx> {
|
||
|
fn hash<H: Hash + Hasher>(&self, other: &Self) -> H {
|
||
|
self._idx.hash(other._idx)
|
||
|
}
|
||
|
fn eq(&self, other: &Self) -> bool {
|
||
|
self._idx.eq(other._idx)
|
||
|
}
|
||
|
}
|
||
|
#[test]
|
||
|
fn test_size_of_robin_hash_table() {
|
||
|
use std::mem::size_of;
|
||
|
println!("{}", size_of::<RobinHashTable<1024>>());
|
||
|
println!("{}", size_of::<RobinHashTable<65536>>());
|
||
|
}
|