Skip to content

Commit da27df4

Browse files
committed
Rewrite builder to use perfect hash functions
1 parent d5518e3 commit da27df4

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

data-crate-builder/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ path = "src/main.rs"
99

1010
[dependencies]
1111
getopts = "0.2"
12+
phf_codegen = "0.7.12"
1213
quick-error = "0.2"
1314

1415
[dependencies.zoneinfo_parse]

data-crate-builder/src/data_crate.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use zoneinfo_parse::table::{Table, TableBuilder};
1515
use zoneinfo_parse::structure::{Structure, Child};
1616
use zoneinfo_parse::transitions::{TableTransitions};
1717

18+
use phf_codegen::Map as PHFMap;
19+
1820
use errors::{Error, ParseError};
1921

2022

@@ -164,13 +166,16 @@ impl DataCrate {
164166
}
165167

166168
try!(writeln!(base_w, "\n\n"));
167-
try!(writeln!(base_w, "pub fn lookup(input: &str) -> Option<&'static StaticTimeZone<'static>> {{"));
169+
try!(write!(base_w, "static ZONES: phf::Map<&'static str, &'static StaticTimeZone<'static>> = "));
170+
171+
let mut phf_map = PHFMap::new();
168172
for name in &keys {
169-
try!(writeln!(base_w, " if input == {:?} {{", name));
170-
try!(writeln!(base_w, " return Some(&{});", sanitise_name(name).replace("/", "::")));
171-
try!(writeln!(base_w, " }}"));
173+
phf_map.entry(&***name, &format!("&{}", sanitise_name(name).replace("/", "::")));
172174
}
173-
try!(writeln!(base_w, " return None;"));
175+
try!(phf_map.build(&mut base_w));
176+
177+
try!(writeln!(base_w, ";\n\npub fn lookup(input: &str) -> Option<&'static StaticTimeZone<'static>> {{"));
178+
try!(writeln!(base_w, " ZONES.get(input).cloned()"));
174179
try!(writeln!(base_w, "}}"));
175180

176181
Ok(())
@@ -244,4 +249,5 @@ use datetime::zone::{StaticTimeZone, FixedTimespanSet, FixedTimespan};
244249
/// The imports needed for a `mod.rs` file.
245250
const MOD_HEADER: &'static str = r##"
246251
use datetime::zone::StaticTimeZone;
252+
use phf;
247253
"##;

data-crate-builder/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ use std::env::args_os;
22
use std::io::{Write, stderr};
33
use std::process::exit;
44

5-
extern crate getopts;
65
extern crate datetime;
6+
extern crate getopts;
7+
extern crate phf_codegen;
78
extern crate zoneinfo_parse;
89

910
#[macro_use]

0 commit comments

Comments
 (0)