diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/rust/phf/README.md | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/phf/README.md')
-rw-r--r-- | third_party/rust/phf/README.md | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/third_party/rust/phf/README.md b/third_party/rust/phf/README.md new file mode 100644 index 0000000000..a347377afd --- /dev/null +++ b/third_party/rust/phf/README.md @@ -0,0 +1,127 @@ +# Rust-PHF + +[![CI](https://github.com/rust-phf/rust-phf/actions/workflows/ci.yml/badge.svg)](https://github.com/rust-phf/rust-phf/actions/workflows/ci.yml) [![Latest Version](https://img.shields.io/crates/v/phf.svg)](https://crates.io/crates/phf) + +[Documentation](https://docs.rs/phf) + +Rust-PHF is a library to generate efficient lookup tables at compile time using +[perfect hash functions](http://en.wikipedia.org/wiki/Perfect_hash_function). + +It currently uses the +[CHD algorithm](http://cmph.sourceforge.net/papers/esa09.pdf) and can generate +a 100,000 entry map in roughly .4 seconds. + +MSRV (minimum supported rust version) is Rust 1.60. + +## Usage + +PHF data structures can be constructed via either the procedural +macros in the `phf_macros` crate or code generation supported by the +`phf_codegen` crate. + +To compile the `phf` crate with a dependency on +libcore instead of libstd, enabling use in environments where libstd +will not work, set `default-features = false` for the dependency: + +```toml +[dependencies] +# to use `phf` in `no_std` environments +phf = { version = "0.11", default-features = false } +``` + +### phf_macros + +```rust +use phf::phf_map; + +#[derive(Clone)] +pub enum Keyword { + Loop, + Continue, + Break, + Fn, + Extern, +} + +static KEYWORDS: phf::Map<&'static str, Keyword> = phf_map! { + "loop" => Keyword::Loop, + "continue" => Keyword::Continue, + "break" => Keyword::Break, + "fn" => Keyword::Fn, + "extern" => Keyword::Extern, +}; + +pub fn parse_keyword(keyword: &str) -> Option<Keyword> { + KEYWORDS.get(keyword).cloned() +} +``` + +```toml +[dependencies] +phf = { version = "0.11", features = ["macros"] } +``` + +#### Note + +Currently, the macro syntax has some limitations and may not +work as you want. See [#183] or [#196] for example. + +[#183]: https://github.com/rust-phf/rust-phf/issues/183 +[#196]: https://github.com/rust-phf/rust-phf/issues/196 + +### phf_codegen + +To use `phf_codegen` on build.rs, you have to add dependencies under `[build-dependencies]`: + +```toml +[build-dependencies] +phf = { version = "0.11.1", default-features = false } +phf_codegen = "0.11.1" +``` + +Then put code on build.rs: + +```rust +use std::env; +use std::fs::File; +use std::io::{BufWriter, Write}; +use std::path::Path; + +fn main() { + let path = Path::new(&env::var("OUT_DIR").unwrap()).join("codegen.rs"); + let mut file = BufWriter::new(File::create(&path).unwrap()); + + write!( + &mut file, + "static KEYWORDS: phf::Map<&'static str, Keyword> = {}", + phf_codegen::Map::new() + .entry("loop", "Keyword::Loop") + .entry("continue", "Keyword::Continue") + .entry("break", "Keyword::Break") + .entry("fn", "Keyword::Fn") + .entry("extern", "Keyword::Extern") + .build() + ) + .unwrap(); + write!(&mut file, ";\n").unwrap(); +} +``` + +and lib.rs: + +```rust +#[derive(Clone)] +enum Keyword { + Loop, + Continue, + Break, + Fn, + Extern, +} + +include!(concat!(env!("OUT_DIR"), "/codegen.rs")); + +pub fn parse_keyword(keyword: &str) -> Option<Keyword> { + KEYWORDS.get(keyword).cloned() +} +``` |