Skip to content

Commit ae310a3

Browse files
committedOct 31, 2024
Use a const and binary search instead of a match
1 parent f694c4c commit ae310a3

File tree

3 files changed

+3080
-2248
lines changed

3 files changed

+3080
-2248
lines changed
 

‎dev-tools/gen-target-info/src/main.rs

+13-16
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,9 @@ const PRELUDE: &str = r#"//! This file is generated code. Please edit the genera
1212

1313
fn generate_target_mapping(f: &mut File, target_specs: &RustcTargetSpecs) -> std::io::Result<()> {
1414
writeln!(f, "use super::Target;")?;
15+
writeln!(f, "use std::borrow::Cow;")?;
1516
writeln!(f)?;
16-
writeln!(
17-
f,
18-
"pub(crate) fn get(target_triple: &str) -> Option<Target> {{"
19-
)?;
20-
writeln!(f, " Some(match target_triple {{")?;
17+
writeln!(f, "pub(crate) const LIST: &[(&str, Target)] = &[")?;
2118

2219
for (triple, spec) in &target_specs.0 {
2320
let full_arch = triple.split_once('-').unwrap().0;
@@ -27,20 +24,20 @@ fn generate_target_mapping(f: &mut File, target_specs: &RustcTargetSpecs) -> std
2724
let env = spec.env.as_deref().unwrap_or("");
2825
let abi = spec.abi.as_deref().unwrap_or("");
2926

30-
writeln!(f, " {triple:?} => Target {{")?;
31-
writeln!(f, " full_arch: {full_arch:?}.into(),")?;
32-
writeln!(f, " arch: {arch:?}.into(),")?;
33-
writeln!(f, " vendor: {vendor:?}.into(),")?;
34-
writeln!(f, " os: {os:?}.into(),")?;
35-
writeln!(f, " env: {env:?}.into(),")?;
36-
writeln!(f, " abi: {abi:?}.into(),")?;
27+
writeln!(f, " (")?;
28+
writeln!(f, " {triple:?},")?;
29+
writeln!(f, " Target {{")?;
30+
writeln!(f, " full_arch: Cow::Borrowed({full_arch:?}),")?;
31+
writeln!(f, " arch: Cow::Borrowed({arch:?}),")?;
32+
writeln!(f, " vendor: Cow::Borrowed({vendor:?}),")?;
33+
writeln!(f, " os: Cow::Borrowed({os:?}),")?;
34+
writeln!(f, " env: Cow::Borrowed({env:?}),")?;
35+
writeln!(f, " abi: Cow::Borrowed({abi:?}),")?;
3736
writeln!(f, " }},")?;
37+
writeln!(f, " ),")?;
3838
}
3939

40-
writeln!(f, " _ => return None,")?;
41-
42-
writeln!(f, " }})")?;
43-
writeln!(f, "}}")?;
40+
writeln!(f, "];")?;
4441

4542
Ok(())
4643
}

‎src/target.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod generated;
1111
/// The parts of `rustc`'s target triple.
1212
///
1313
/// See <https://doc.rust-lang.org/cargo/appendix/glossary.html#target>.
14-
#[derive(Debug, PartialEq)]
14+
#[derive(Debug, PartialEq, Clone)]
1515
pub(crate) struct Target {
1616
/// The full architecture, including the subarchitecture.
1717
///
@@ -118,8 +118,11 @@ impl FromStr for Target {
118118

119119
/// This will fail when using a custom target triple unknown to `rustc`.
120120
fn from_str(target_triple: &str) -> Result<Self, Error> {
121-
if let Some(target) = generated::get(target_triple) {
122-
Ok(target)
121+
if let Ok(index) =
122+
generated::LIST.binary_search_by_key(&target_triple, |(target_triple, _)| target_triple)
123+
{
124+
let (_, target) = &generated::LIST[index];
125+
Ok(target.clone())
123126
} else {
124127
Err(Error::new(
125128
ErrorKind::InvalidTarget,

0 commit comments

Comments
 (0)