cfg_if::cfg_if! {
    // Tier 1
    if #[cfg(any(target_os = "linux", target_os = "android"))] {
        mod linux;
        pub use linux::{fill_bytes, hashmap_random_keys};
    } else if #[cfg(target_os = "windows")] {
        mod windows;
        pub use windows::fill_bytes;
    } else if #[cfg(target_vendor = "apple")] {
        mod apple;
        pub use apple::fill_bytes;
    // Others, in alphabetical ordering.
    } else if #[cfg(any(
        target_os = "dragonfly",
        target_os = "freebsd",
        target_os = "haiku",
        target_os = "illumos",
        target_os = "netbsd",
        target_os = "openbsd",
        target_os = "rtems",
        target_os = "solaris",
        target_os = "vita",
        target_os = "nuttx",
    ))] {
        mod arc4random;
        pub use arc4random::fill_bytes;
    } else if #[cfg(target_os = "emscripten")] {
        mod getentropy;
        pub use getentropy::fill_bytes;
    } else if #[cfg(target_os = "espidf")] {
        mod espidf;
        pub use espidf::fill_bytes;
    } else if #[cfg(target_os = "fuchsia")] {
        mod fuchsia;
        pub use fuchsia::fill_bytes;
    } else if #[cfg(target_os = "hermit")] {
        mod hermit;
        pub use hermit::fill_bytes;
    } else if #[cfg(any(target_os = "horizon", target_os = "cygwin"))] {
        // FIXME(horizon): add arc4random_buf to shim-3ds
        mod getrandom;
        pub use getrandom::fill_bytes;
    } else if #[cfg(any(
        target_os = "aix",
        target_os = "hurd",
        target_os = "l4re",
        target_os = "nto",
    ))] {
        mod unix_legacy;
        pub use unix_legacy::fill_bytes;
    } else if #[cfg(target_os = "redox")] {
        mod redox;
        pub use redox::fill_bytes;
    } else if #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))] {
        mod sgx;
        pub use sgx::fill_bytes;
    } else if #[cfg(target_os = "solid_asp3")] {
        mod solid;
        pub use solid::fill_bytes;
    } else if #[cfg(target_os = "teeos")] {
        mod teeos;
        pub use teeos::fill_bytes;
    } else if #[cfg(target_os = "trusty")] {
        mod trusty;
        pub use trusty::fill_bytes;
    } else if #[cfg(target_os = "uefi")] {
        mod uefi;
        pub use uefi::fill_bytes;
    } else if #[cfg(target_os = "vxworks")] {
        mod vxworks;
        pub use vxworks::fill_bytes;
    } else if #[cfg(target_os = "wasi")] {
        mod wasi;
        pub use wasi::fill_bytes;
    } else if #[cfg(target_os = "zkvm")] {
        mod zkvm;
        pub use zkvm::fill_bytes;
    } else if #[cfg(any(
        all(target_family = "wasm", target_os = "unknown"),
        target_os = "xous",
    ))] {
        // FIXME: finally remove std support for wasm32-unknown-unknown
        // FIXME: add random data generation to xous
        mod unsupported;
        pub use unsupported::{fill_bytes, hashmap_random_keys};
    }
}

#[cfg(not(any(
    target_os = "linux",
    target_os = "android",
    all(target_family = "wasm", target_os = "unknown"),
    target_os = "xous",
)))]
pub fn hashmap_random_keys() -> (u64, u64) {
    let mut buf = [0; 16];
    fill_bytes(&mut buf);
    let k1 = u64::from_ne_bytes(buf[..8].try_into().unwrap());
    let k2 = u64::from_ne_bytes(buf[8..].try_into().unwrap());
    (k1, k2)
}
