use multiversion::{
multiversion,
target::{match_target, selected_target, target_cfg, target_cfg_attr, target_cfg_f},
};
#[test]
fn cfg() {
#[multiversion(targets = "simd")]
fn foo() {
#[target_cfg(all(target_arch = "x86_64", target_feature = "avx"))]
fn test_avx(has_avx: bool) {
assert!(has_avx);
}
#[target_cfg(not(all(target_arch = "x86_64", target_feature = "avx")))]
fn test_avx(has_avx: bool) {
assert!(!has_avx);
}
let has_avx =
std::env::consts::ARCH == "x86_64" && selected_target!().supports_feature_str("avx");
test_avx(has_avx);
}
foo();
}
#[test]
fn cfg_attr() {
#[multiversion(targets = "simd")]
fn foo() {
#[target_cfg_attr(all(target_arch = "x86_64", target_feature = "avx"), cfg(all()))]
#[target_cfg_attr(not(all(target_arch = "x86_64", target_feature = "avx")), cfg(any()))]
fn test_avx(has_avx: bool) {
assert!(has_avx);
}
#[target_cfg_attr(all(target_arch = "x86_64", target_feature = "avx"), cfg(any()))]
#[target_cfg_attr(not(all(target_arch = "x86_64", target_feature = "avx")), cfg(all()))]
fn test_avx(has_avx: bool) {
assert!(!has_avx);
}
let has_avx =
std::env::consts::ARCH == "x86_64" && selected_target!().supports_feature_str("avx");
test_avx(has_avx);
}
foo();
}
#[test]
fn cfg_f() {
#[multiversion(targets = "simd")]
fn foo() {
let cfg_avx = target_cfg_f!(all(target_arch = "x86_64", target_feature = "avx"));
let has_avx =
std::env::consts::ARCH == "x86_64" && selected_target!().supports_feature_str("avx");
assert_eq!(cfg_avx, has_avx);
}
foo();
}
#[test]
fn match_target() {
#[multiversion(targets = "simd")]
fn foo() {
let match_avx = match_target! {
"x86_64+avx" => true,
"aarch64+neon" | "x86_64+sse" => false,
_ => false,
};
let has_avx =
std::env::consts::ARCH == "x86_64" && selected_target!().supports_feature_str("avx");
assert_eq!(match_avx, has_avx);
}
foo();
}