1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
//! Compile-time generated maps and sets. //! //! The `phf::Map` and `phf::Set` types have roughly comparable performance to //! a standard hash table, but can be generated as compile-time static values. //! //! # Usage //! //! If the `macros` Cargo feature is enabled, the `phf_map`, `phf_set`, //! `phf_ordered_map`, and `phf_ordered_set` macros can be used to construct //! the PHF type. This method can be used with a stable compiler //! (minimum supported rust version is 1.46). //! //! ```toml //! [dependencies] //! phf = { version = "0.9", features = ["macros"] } //! ``` //! //! ``` //! use phf::{phf_map, phf_set}; //! //! static MY_MAP: phf::Map<&'static str, u32> = phf_map! { //! "hello" => 1, //! "world" => 2, //! }; //! //! static MY_SET: phf::Set<&'static str> = phf_set! { //! "hello world", //! "hola mundo", //! }; //! //! fn main() { //! assert_eq!(MY_MAP["hello"], 1); //! assert!(MY_SET.contains("hello world")); //! } //! ``` //! //! Alternatively, you can use the `phf_codegen` crate to generate PHF datatypes //! in a build script. //! //! ## 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 #![doc(html_root_url = "https://docs.rs/phf/0.9")] #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] extern crate std as core; #[cfg(feature = "macros")] /// Macro to create a `static` (compile-time) [`Map`]. /// /// Requires the `macros` feature. /// /// # Example /// /// ``` /// use phf::{phf_map, Map}; /// /// static MY_MAP: Map<&'static str, u32> = phf_map! { /// "hello" => 1, /// "world" => 2, /// }; /// /// fn main () { /// assert_eq!(MY_MAP["hello"], 1); /// } /// ``` #[::proc_macro_hack::proc_macro_hack] pub use phf_macros::phf_map; #[cfg(feature = "macros")] /// Macro to create a `static` (compile-time) [`OrderedMap`]. /// /// Requires the `macros` feature. Same usage as [`phf_map`]. #[::proc_macro_hack::proc_macro_hack] pub use phf_macros::phf_ordered_map; #[cfg(feature = "macros")] /// Macro to create a `static` (compile-time) [`Set`]. /// /// Requires the `macros` feature. /// /// # Example /// /// ``` /// use phf::{phf_set, Set}; /// /// static MY_SET: Set<&'static str> = phf_set! { /// "hello world", /// "hola mundo", /// }; /// /// fn main () { /// assert!(MY_SET.contains("hello world")); /// } /// ``` #[proc_macro_hack::proc_macro_hack] pub use phf_macros::phf_set; #[cfg(feature = "macros")] /// Macro to create a `static` (compile-time) [`OrderedSet`]. /// /// Requires the `macros` feature. Same usage as [`phf_set`]. #[proc_macro_hack::proc_macro_hack] pub use phf_macros::phf_ordered_set; use core::ops::Deref; #[doc(inline)] pub use self::map::Map; #[doc(inline)] pub use self::ordered_map::OrderedMap; #[doc(inline)] pub use self::ordered_set::OrderedSet; #[doc(inline)] pub use self::set::Set; pub use phf_shared::PhfHash; pub mod map; pub mod ordered_map; pub mod ordered_set; pub mod set; // WARNING: this is not considered part of phf's public API and is subject to // change at any time. // // Basically Cow, but with the Owned version conditionally compiled. #[doc(hidden)] pub enum Slice<T: 'static> { Static(&'static [T]), #[cfg(feature = "std")] Dynamic(Vec<T>), } impl<T> Deref for Slice<T> { type Target = [T]; fn deref(&self) -> &[T] { match *self { Slice::Static(t) => t, #[cfg(feature = "std")] Slice::Dynamic(ref t) => t, } } }