Essentially, I want to use dynamic dispatch to return one of 42 different types of PostQuantumTypes
as seen below:
fn get_new_alice(algorithm: u8) -> Box<dyn PostQuantumType> {
assert!(algorithm < ALGORITHM_COUNT);
match algorithm {
// 0
BABYBEAR => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_babybear::new_alice())
}
// 1
BABYBEAREPHEM => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_babybearephem::new_alice())
}
// 2
FIRESABER => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_firesaber::new_alice())
}
// ...
FRODOKEM640AES => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem640aes::new_alice())
}
FRODOKEM640SHAKE => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem640shake::new_alice())
}
FRODOKEM976AES => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem976aes::new_alice())
}
FRODOKEM976SHAKE => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem976shake::new_alice())
}
FRODOKEM1344AES => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem1344aes::new_alice())
}
FRODOKEM1344SHAKE => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_frodokem1344shake::new_alice())
}
KYBER512 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber512::new_alice())
}
KYBER768 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber768::new_alice())
}
KYBER1024 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber1024::new_alice())
}
KYBER51290S => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber51290s::new_alice())
}
KYBER76890S => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber76890s::new_alice())
}
KYBER102490S => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_kyber102490s::new_alice())
}
LEDAKEMLT12 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ledakemlt12::new_alice())
}
LEDAKEMLT32 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ledakemlt32::new_alice())
}
LEDAKEMLT52 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ledakemlt52::new_alice())
}
LIGHTSABER => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_lightsaber::new_alice())
}
MAMABEAR => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mamabear::new_alice())
}
MAMABEAREPHEM => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mamabearephem::new_alice())
}
MCELIECE348864 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece348864::new_alice())
}
MCELIECE348864F => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece348864f::new_alice())
}
MCELIECE460896 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece460896::new_alice())
}
MCELIECE460896F => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece460896f::new_alice())
}
MCELIECE6688128 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece6688128::new_alice())
}
MCELIECE6688128F => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece6688128f::new_alice())
}
MCELIECE6960119 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece6960119::new_alice())
}
MCELIECE6960119F => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece6960119f::new_alice())
}
MCELIECE8192128 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece8192128::new_alice())
}
MCELIECE8192128F => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_mceliece8192128f::new_alice())
}
NEWHOPE512CCA => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_newhope512cca::new_alice())
}
NEWHOPE512CPA => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_newhope512cpa::new_alice())
}
NEWHOPE1024CCA => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_newhope1024cca::new_alice())
}
NEWHOPE1024CPA => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_newhope1024cpa::new_alice())
}
NTRUHPS2048509 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ntruhps2048509::new_alice())
}
NTRUHPS2048677 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ntruhps2048677::new_alice())
}
NTRUHPS4096821 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ntruhps4096821::new_alice())
}
NTRUHRSS701 => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_ntruhrss701::new_alice())
}
PAPABEAR => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_papabear::new_alice())
}
PAPABEAREPHEM => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_papabearephem::new_alice())
}
SABER => {
Box::new(crate::post_quantum_structs::PostQuantumAlgorithmData_saber::new_alice())
}
_ => {
unreachable!()
}
}
However, when there are this many cases, it causes a StackOverflowError
. What would be a better way of mapping byte-sized values to the corresponding constructor?