Coverage Report

Created: 2026-07-13 08:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/phf_shared-0.13.1/src/lib.rs
Line
Count
Source
1
//! See [the `phf` crate's documentation][phf] for details.
2
//!
3
//! [phf]: https://docs.rs/phf
4
5
#![doc(html_root_url = "https://docs.rs/phf_shared/0.13.1")]
6
#![cfg_attr(not(feature = "std"), no_std)]
7
8
#[cfg(feature = "std")]
9
extern crate std as core;
10
11
use core::fmt;
12
use core::hash::{Hash, Hasher};
13
use core::num::Wrapping;
14
use siphasher::sip128::{Hash128, Hasher128, SipHasher13};
15
16
#[non_exhaustive]
17
pub struct Hashes {
18
    pub g: u32,
19
    pub f1: u32,
20
    pub f2: u32,
21
}
22
23
/// A central typedef for hash keys
24
///
25
/// Makes experimentation easier by only needing to be updated here.
26
pub type HashKey = u64;
27
28
#[inline]
29
2.83M
pub fn displace(f1: u32, f2: u32, d1: u32, d2: u32) -> u32 {
30
2.83M
    (Wrapping(d2) + Wrapping(f1) * Wrapping(d1) + Wrapping(f2)).0
31
2.83M
}
phf_shared::displace
Line
Count
Source
29
2.83M
pub fn displace(f1: u32, f2: u32, d1: u32, d2: u32) -> u32 {
30
2.83M
    (Wrapping(d2) + Wrapping(f1) * Wrapping(d1) + Wrapping(f2)).0
31
2.83M
}
Unexecuted instantiation: phf_shared::displace
32
33
/// `key` is from `phf_generator::HashState`.
34
#[inline]
35
2.83M
pub fn hash<T: ?Sized + PhfHash>(x: &T, key: &HashKey) -> Hashes {
36
2.83M
    let mut hasher = SipHasher13::new_with_keys(0, *key);
37
2.83M
    x.phf_hash(&mut hasher);
38
39
    let Hash128 {
40
2.83M
        h1: lower,
41
2.83M
        h2: upper,
42
2.83M
    } = hasher.finish128();
43
44
2.83M
    Hashes {
45
2.83M
        g: (lower >> 32) as u32,
46
2.83M
        f1: lower as u32,
47
2.83M
        f2: upper as u32,
48
2.83M
    }
49
2.83M
}
phf_shared::hash::<unicase::UniCase<&str>>
Line
Count
Source
35
2.83M
pub fn hash<T: ?Sized + PhfHash>(x: &T, key: &HashKey) -> Hashes {
36
2.83M
    let mut hasher = SipHasher13::new_with_keys(0, *key);
37
2.83M
    x.phf_hash(&mut hasher);
38
39
    let Hash128 {
40
2.83M
        h1: lower,
41
2.83M
        h2: upper,
42
2.83M
    } = hasher.finish128();
43
44
2.83M
    Hashes {
45
2.83M
        g: (lower >> 32) as u32,
46
2.83M
        f1: lower as u32,
47
2.83M
        f2: upper as u32,
48
2.83M
    }
49
2.83M
}
Unexecuted instantiation: phf_shared::hash::<_>
50
51
/// Return an index into `phf_generator::HashState::map`.
52
///
53
/// * `hash` is from `hash()` in this crate.
54
/// * `disps` is from `phf_generator::HashState::disps`.
55
/// * `len` is the length of `phf_generator::HashState::map`.
56
#[inline]
57
2.83M
pub fn get_index(hashes: &Hashes, disps: &[(u32, u32)], len: usize) -> u32 {
58
2.83M
    let (d1, d2) = disps[(hashes.g % (disps.len() as u32)) as usize];
59
2.83M
    displace(hashes.f1, hashes.f2, d1, d2) % (len as u32)
60
2.83M
}
phf_shared::get_index
Line
Count
Source
57
2.83M
pub fn get_index(hashes: &Hashes, disps: &[(u32, u32)], len: usize) -> u32 {
58
2.83M
    let (d1, d2) = disps[(hashes.g % (disps.len() as u32)) as usize];
59
2.83M
    displace(hashes.f1, hashes.f2, d1, d2) % (len as u32)
60
2.83M
}
Unexecuted instantiation: phf_shared::get_index
61
62
/// A trait implemented by types which can be used in PHF data structures.
63
///
64
/// This differs from the standard library's `Hash` trait in that `PhfHash`'s
65
/// results must be architecture independent so that hashes will be consistent
66
/// between the host and target when cross compiling.
67
pub trait PhfHash {
68
    /// Feeds the value into the state given, updating the hasher as necessary.
69
    fn phf_hash<H: Hasher>(&self, state: &mut H);
70
71
    /// Feeds a slice of this type into the state provided.
72
0
    fn phf_hash_slice<H: Hasher>(data: &[Self], state: &mut H)
73
0
    where
74
0
        Self: Sized,
75
    {
76
0
        for piece in data {
77
0
            piece.phf_hash(state);
78
0
        }
79
0
    }
80
}
81
82
/// Trait for printing types with `const` constructors, used by `phf_codegen` and `phf_macros`.
83
pub trait FmtConst {
84
    /// Print a `const` expression representing this value.
85
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
86
}
87
88
/// Identical to `std::borrow::Borrow` except omitting blanket impls to facilitate other
89
/// borrowing patterns.
90
///
91
/// The same semantic requirements apply:
92
///
93
/// > In particular `Eq`, `Ord` and `Hash` must be equivalent for borrowed and owned values:
94
/// > `x.borrow() == y.borrow()` should give the same result as `x == y`.
95
///
96
/// (This crate's API only requires `Eq` and `PhfHash`, however.)
97
///
98
/// ### Motivation
99
/// The conventional signature for lookup methods on collections looks something like this:
100
///
101
/// ```ignore
102
/// impl<K, V> Map<K, V> where K: PhfHash + Eq {
103
///     fn get<T: ?Sized>(&self, key: &T) -> Option<&V> where T: PhfHash + Eq, K: Borrow<T> {
104
///         ...
105
///     }
106
/// }
107
/// ```
108
///
109
/// This allows the key type used for lookup to be different than the key stored in the map so for
110
/// example you can use `&str` to look up a value in a `Map<String, _>`. However, this runs into
111
/// a problem in the case where `T` and `K` are both a `Foo<_>` type constructor but
112
/// the contained type is different (even being the same type with different lifetimes).
113
///
114
/// The main issue for this crate's API is that, with this method signature, you cannot perform a
115
/// lookup on a `Map<UniCase<&'static str>, _>` with a `UniCase<&'a str>` where `'a` is not
116
/// `'static`; there is no impl of `Borrow` that resolves to
117
/// `impl Borrow<UniCase<'a>> for UniCase<&'static str>` and one cannot be added either because of
118
/// all the blanket impls.
119
///
120
/// Instead, this trait is implemented conservatively, without blanket impls, so that impls like
121
/// this may be added. This is feasible since the set of types that implement `PhfHash` is
122
/// intentionally small.
123
///
124
/// This likely won't be fixable with specialization alone but will require full support for lattice
125
/// impls since we technically want to add overlapping blanket impls.
126
pub trait PhfBorrow<B: ?Sized> {
127
    /// Convert a reference to `self` to a reference to the borrowed type.
128
    fn borrow(&self) -> &B;
129
}
130
131
/// Create an impl of `FmtConst` delegating to `fmt::Debug` for types that can deal with it.
132
///
133
/// Ideally with specialization this could be just one default impl and then specialized where
134
/// it doesn't apply.
135
macro_rules! delegate_debug (
136
    ($ty:ty) => {
137
        impl FmtConst for $ty {
138
0
            fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
139
0
                write!(f, "{:?}", self)
140
0
            }
Unexecuted instantiation: <alloc::string::String as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <str as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <char as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <u8 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <i8 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <u16 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <i16 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <u32 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <i32 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <u64 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <i64 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <usize as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <isize as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <u128 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <i128 as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <bool as phf_shared::FmtConst>::fmt_const
141
        }
142
    }
143
);
144
145
delegate_debug!(str);
146
delegate_debug!(char);
147
delegate_debug!(u8);
148
delegate_debug!(i8);
149
delegate_debug!(u16);
150
delegate_debug!(i16);
151
delegate_debug!(u32);
152
delegate_debug!(i32);
153
delegate_debug!(u64);
154
delegate_debug!(i64);
155
delegate_debug!(usize);
156
delegate_debug!(isize);
157
delegate_debug!(u128);
158
delegate_debug!(i128);
159
delegate_debug!(bool);
160
161
/// `impl PhfBorrow<T> for T`
162
macro_rules! impl_reflexive(
163
    ($($t:ty),*) => (
164
        $(impl PhfBorrow<$t> for $t {
165
0
            fn borrow(&self) -> &$t {
166
0
                self
167
0
            }
Unexecuted instantiation: <u16 as phf_shared::PhfBorrow<u16>>::borrow
Unexecuted instantiation: <i16 as phf_shared::PhfBorrow<i16>>::borrow
Unexecuted instantiation: <u32 as phf_shared::PhfBorrow<u32>>::borrow
Unexecuted instantiation: <i32 as phf_shared::PhfBorrow<i32>>::borrow
Unexecuted instantiation: <u64 as phf_shared::PhfBorrow<u64>>::borrow
Unexecuted instantiation: <i64 as phf_shared::PhfBorrow<i64>>::borrow
Unexecuted instantiation: <usize as phf_shared::PhfBorrow<usize>>::borrow
Unexecuted instantiation: <isize as phf_shared::PhfBorrow<isize>>::borrow
Unexecuted instantiation: <u128 as phf_shared::PhfBorrow<u128>>::borrow
Unexecuted instantiation: <i128 as phf_shared::PhfBorrow<i128>>::borrow
Unexecuted instantiation: <bool as phf_shared::PhfBorrow<bool>>::borrow
Unexecuted instantiation: <[u8] as phf_shared::PhfBorrow<[u8]>>::borrow
Unexecuted instantiation: <str as phf_shared::PhfBorrow<str>>::borrow
Unexecuted instantiation: <char as phf_shared::PhfBorrow<char>>::borrow
Unexecuted instantiation: <u8 as phf_shared::PhfBorrow<u8>>::borrow
Unexecuted instantiation: <i8 as phf_shared::PhfBorrow<i8>>::borrow
168
        })*
169
    )
170
);
171
172
impl_reflexive!(
173
    str,
174
    char,
175
    u8,
176
    i8,
177
    u16,
178
    i16,
179
    u32,
180
    i32,
181
    u64,
182
    i64,
183
    usize,
184
    isize,
185
    u128,
186
    i128,
187
    bool,
188
    [u8]
189
);
190
191
#[cfg(feature = "std")]
192
impl PhfBorrow<str> for String {
193
0
    fn borrow(&self) -> &str {
194
0
        self
195
0
    }
196
}
197
198
#[cfg(feature = "std")]
199
impl PhfBorrow<[u8]> for Vec<u8> {
200
0
    fn borrow(&self) -> &[u8] {
201
0
        self
202
0
    }
203
}
204
205
#[cfg(feature = "std")]
206
delegate_debug!(String);
207
208
#[cfg(feature = "std")]
209
impl PhfHash for String {
210
    #[inline]
211
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
212
0
        (**self).phf_hash(state)
213
0
    }
214
}
215
216
#[cfg(feature = "std")]
217
impl PhfHash for Vec<u8> {
218
    #[inline]
219
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
220
0
        (**self).phf_hash(state)
221
0
    }
222
}
223
224
impl<'a, T: 'a + PhfHash + ?Sized> PhfHash for &'a T {
225
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
226
0
        (*self).phf_hash(state)
227
0
    }
228
}
229
230
impl<'a, T: 'a + FmtConst + ?Sized> FmtConst for &'a T {
231
0
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
232
0
        (*self).fmt_const(f)
233
0
    }
234
}
235
236
impl PhfBorrow<str> for &str {
237
0
    fn borrow(&self) -> &str {
238
0
        self
239
0
    }
240
}
241
242
impl PhfBorrow<[u8]> for &[u8] {
243
0
    fn borrow(&self) -> &[u8] {
244
0
        self
245
0
    }
246
}
247
248
impl<const N: usize> PhfBorrow<[u8; N]> for &[u8; N] {
249
0
    fn borrow(&self) -> &[u8; N] {
250
0
        self
251
0
    }
252
}
253
254
impl PhfHash for str {
255
    #[inline]
256
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
257
0
        self.as_bytes().phf_hash(state)
258
0
    }
259
}
260
261
impl PhfHash for [u8] {
262
    #[inline]
263
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
264
0
        state.write(self);
265
0
    }
266
}
267
268
impl FmtConst for [u8] {
269
    #[inline]
270
0
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
271
        // slices need a leading reference
272
0
        write!(f, "&{:?}", self)
273
0
    }
274
}
275
276
#[cfg(feature = "unicase")]
277
impl<S> PhfHash for unicase::UniCase<S>
278
where
279
    unicase::UniCase<S>: Hash,
280
{
281
    #[inline]
282
2.83M
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
283
2.83M
        self.hash(state)
284
2.83M
    }
<unicase::UniCase<&str> as phf_shared::PhfHash>::phf_hash::<siphasher::sip128::SipHasher13>
Line
Count
Source
282
2.83M
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
283
2.83M
        self.hash(state)
284
2.83M
    }
Unexecuted instantiation: <unicase::UniCase<_> as phf_shared::PhfHash>::phf_hash::<_>
285
}
286
287
#[cfg(feature = "unicase")]
288
impl<S> FmtConst for unicase::UniCase<S>
289
where
290
    S: AsRef<str>,
291
{
292
0
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
293
0
        if self.is_ascii() {
294
0
            f.write_str("UniCase::ascii(")?;
295
        } else {
296
0
            f.write_str("UniCase::unicode(")?;
297
        }
298
299
0
        self.as_ref().fmt_const(f)?;
300
0
        f.write_str(")")
301
0
    }
302
}
303
304
#[cfg(feature = "unicase")]
305
impl<'b, 'a: 'b, S: ?Sized + 'a> PhfBorrow<unicase::UniCase<&'b S>> for unicase::UniCase<&'a S> {
306
2.83M
    fn borrow(&self) -> &unicase::UniCase<&'b S> {
307
2.83M
        self
308
2.83M
    }
<unicase::UniCase<&str> as phf_shared::PhfBorrow<unicase::UniCase<&str>>>::borrow
Line
Count
Source
306
2.83M
    fn borrow(&self) -> &unicase::UniCase<&'b S> {
307
2.83M
        self
308
2.83M
    }
Unexecuted instantiation: <unicase::UniCase<&_> as phf_shared::PhfBorrow<unicase::UniCase<&_>>>::borrow
309
}
310
311
#[cfg(feature = "unicase")]
312
impl<S> PhfHash for unicase::Ascii<S>
313
where
314
    unicase::Ascii<S>: Hash,
315
{
316
    #[inline]
317
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
318
0
        self.hash(state)
319
0
    }
320
}
321
322
#[cfg(feature = "unicase")]
323
impl<S> FmtConst for unicase::Ascii<S>
324
where
325
    S: AsRef<str>,
326
{
327
0
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
328
0
        f.write_str("Ascii::new(")?;
329
0
        self.as_ref().fmt_const(f)?;
330
0
        f.write_str(")")
331
0
    }
332
}
333
334
#[cfg(feature = "unicase")]
335
impl<'b, 'a: 'b, S: ?Sized + 'a> PhfBorrow<unicase::Ascii<&'b S>> for unicase::Ascii<&'a S> {
336
0
    fn borrow(&self) -> &unicase::Ascii<&'b S> {
337
0
        self
338
0
    }
339
}
340
341
#[cfg(feature = "uncased")]
342
impl PhfHash for uncased::UncasedStr {
343
    #[inline]
344
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
345
        self.hash(state)
346
    }
347
}
348
349
#[cfg(feature = "uncased")]
350
impl FmtConst for uncased::UncasedStr {
351
    fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
352
        f.write_str("UncasedStr::new(")?;
353
        self.as_str().fmt_const(f)?;
354
        f.write_str(")")
355
    }
356
}
357
358
#[cfg(feature = "uncased")]
359
impl PhfBorrow<uncased::UncasedStr> for &uncased::UncasedStr {
360
    fn borrow(&self) -> &uncased::UncasedStr {
361
        self
362
    }
363
}
364
365
macro_rules! sip_impl (
366
    (le $t:ty) => (
367
        impl PhfHash for $t {
368
            #[inline]
369
0
            fn phf_hash<H: Hasher>(&self, state: &mut H) {
370
0
                self.to_le().hash(state);
371
0
            }
Unexecuted instantiation: <u16 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <i16 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <u32 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <i32 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <u64 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <i64 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <usize as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <isize as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <u128 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <i128 as phf_shared::PhfHash>::phf_hash::<_>
372
        }
373
    );
374
    ($t:ty) => (
375
        impl PhfHash for $t {
376
            #[inline]
377
0
            fn phf_hash<H: Hasher>(&self, state: &mut H) {
378
0
                self.hash(state);
379
0
            }
Unexecuted instantiation: <u8 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <i8 as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <bool as phf_shared::PhfHash>::phf_hash::<_>
380
        }
381
    )
382
);
383
384
sip_impl!(u8);
385
sip_impl!(i8);
386
sip_impl!(le u16);
387
sip_impl!(le i16);
388
sip_impl!(le u32);
389
sip_impl!(le i32);
390
sip_impl!(le u64);
391
sip_impl!(le i64);
392
sip_impl!(le usize);
393
sip_impl!(le isize);
394
sip_impl!(le u128);
395
sip_impl!(le i128);
396
sip_impl!(bool);
397
398
impl PhfHash for char {
399
    #[inline]
400
0
    fn phf_hash<H: Hasher>(&self, state: &mut H) {
401
0
        (*self as u32).phf_hash(state)
402
0
    }
403
}
404
405
// minimize duplicated code since formatting drags in quite a bit
406
0
fn fmt_array<T: core::fmt::Debug>(array: &[T], f: &mut fmt::Formatter<'_>) -> fmt::Result {
407
0
    write!(f, "{:?}", array)
408
0
}
409
410
macro_rules! array_impl (
411
    ($t:ty) => (
412
        impl<const N: usize> PhfHash for [$t; N] {
413
            #[inline]
414
0
            fn phf_hash<H: Hasher>(&self, state: &mut H) {
415
0
                for v in &self[..] {
416
0
                    v.phf_hash(state);
417
0
                }
418
0
            }
Unexecuted instantiation: <[u8; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i8; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u16; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i16; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[bool; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[char; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u32; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i32; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u64; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i64; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[usize; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[isize; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u128; _] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i128; _] as phf_shared::PhfHash>::phf_hash::<_>
419
        }
420
421
        impl<const N: usize> FmtConst for [$t; N] {
422
0
            fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
423
0
                fmt_array(self, f)
424
0
            }
Unexecuted instantiation: <[u8; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[i8; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[u16; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[bool; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[char; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[i16; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[u32; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[i32; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[u64; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[i64; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[usize; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[isize; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[u128; _] as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <[i128; _] as phf_shared::FmtConst>::fmt_const
425
        }
426
427
        impl<const N: usize> PhfBorrow<[$t]> for [$t; N] {
428
0
            fn borrow(&self) -> &[$t] {
429
0
                self
430
0
            }
Unexecuted instantiation: <[u8; _] as phf_shared::PhfBorrow<[u8]>>::borrow
Unexecuted instantiation: <[i8; _] as phf_shared::PhfBorrow<[i8]>>::borrow
Unexecuted instantiation: <[u16; _] as phf_shared::PhfBorrow<[u16]>>::borrow
Unexecuted instantiation: <[bool; _] as phf_shared::PhfBorrow<[bool]>>::borrow
Unexecuted instantiation: <[char; _] as phf_shared::PhfBorrow<[char]>>::borrow
Unexecuted instantiation: <[i16; _] as phf_shared::PhfBorrow<[i16]>>::borrow
Unexecuted instantiation: <[u32; _] as phf_shared::PhfBorrow<[u32]>>::borrow
Unexecuted instantiation: <[i32; _] as phf_shared::PhfBorrow<[i32]>>::borrow
Unexecuted instantiation: <[u64; _] as phf_shared::PhfBorrow<[u64]>>::borrow
Unexecuted instantiation: <[i64; _] as phf_shared::PhfBorrow<[i64]>>::borrow
Unexecuted instantiation: <[usize; _] as phf_shared::PhfBorrow<[usize]>>::borrow
Unexecuted instantiation: <[isize; _] as phf_shared::PhfBorrow<[isize]>>::borrow
Unexecuted instantiation: <[u128; _] as phf_shared::PhfBorrow<[u128]>>::borrow
Unexecuted instantiation: <[i128; _] as phf_shared::PhfBorrow<[i128]>>::borrow
431
        }
432
    )
433
);
434
435
array_impl!(u8);
436
array_impl!(i8);
437
array_impl!(u16);
438
array_impl!(i16);
439
array_impl!(u32);
440
array_impl!(i32);
441
array_impl!(u64);
442
array_impl!(i64);
443
array_impl!(usize);
444
array_impl!(isize);
445
array_impl!(u128);
446
array_impl!(i128);
447
array_impl!(bool);
448
array_impl!(char);
449
450
macro_rules! slice_impl (
451
    ($t:ty) => {
452
        impl PhfHash for [$t] {
453
            #[inline]
454
0
            fn phf_hash<H: Hasher>(&self, state: &mut H) {
455
0
                for v in self {
456
0
                    v.phf_hash(state);
457
0
                }
458
0
            }
Unexecuted instantiation: <[i8] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u16] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i16] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u32] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i32] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u64] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i64] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[usize] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[isize] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[u128] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[i128] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[bool] as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <[char] as phf_shared::PhfHash>::phf_hash::<_>
459
        }
460
    };
461
);
462
463
slice_impl!(i8);
464
slice_impl!(u16);
465
slice_impl!(i16);
466
slice_impl!(u32);
467
slice_impl!(i32);
468
slice_impl!(u64);
469
slice_impl!(i64);
470
slice_impl!(usize);
471
slice_impl!(isize);
472
slice_impl!(u128);
473
slice_impl!(i128);
474
slice_impl!(bool);
475
slice_impl!(char);
476
477
macro_rules! tuple_impl {
478
    ($($t:ident),+) => {
479
        impl<$($t: PhfHash),+> PhfHash for ($($t,)+) {
480
0
            fn phf_hash<HS: Hasher>(&self, state: &mut HS) {
481
                #[allow(non_snake_case)]
482
0
                let ($($t,)+) = self;
483
                $(
484
0
                    $t.phf_hash(state);
485
                )+
486
0
            }
Unexecuted instantiation: <(_,) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _, _) as phf_shared::PhfHash>::phf_hash::<_>
487
        }
488
489
        impl<$($t: PhfHash),+> PhfBorrow<($($t,)+)> for ($($t,)+) {
490
0
            fn borrow(&self) -> &($($t,)+) {
491
0
                self
492
0
            }
Unexecuted instantiation: <(_,) as phf_shared::PhfBorrow<(_,)>>::borrow
Unexecuted instantiation: <(_, _) as phf_shared::PhfBorrow<(_, _)>>::borrow
Unexecuted instantiation: <(_, _, _) as phf_shared::PhfBorrow<(_, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _, _, _, _, _)>>::borrow
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _, _) as phf_shared::PhfBorrow<(_, _, _, _, _, _, _, _, _, _, _, _)>>::borrow
493
        }
494
495
        impl<$($t: FmtConst),+> FmtConst for ($($t,)+) {
496
0
            fn fmt_const(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
497
                #[allow(non_snake_case)]
498
0
                let ($($t,)+) = self;
499
0
                write!(f, "(")?;
500
0
                let mut first = true;
501
                $(
502
0
                    if !core::mem::replace(&mut first, false) {
503
0
                        write!(f, ", ")?;
504
0
                    }
505
0
                    $t.fmt_const(f)?;
506
                )+
507
0
                write!(f, ")")
508
0
            }
Unexecuted instantiation: <(_,) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
Unexecuted instantiation: <(_, _, _, _, _, _, _, _, _, _, _, _) as phf_shared::FmtConst>::fmt_const
509
        }
510
    };
511
}
512
513
tuple_impl!(A);
514
tuple_impl!(A, B);
515
tuple_impl!(A, B, C);
516
tuple_impl!(A, B, C, D);
517
tuple_impl!(A, B, C, D, E);
518
tuple_impl!(A, B, C, D, E, F);
519
tuple_impl!(A, B, C, D, E, F, G);
520
tuple_impl!(A, B, C, D, E, F, G, HT);
521
tuple_impl!(A, B, C, D, E, F, G, HT, I);
522
tuple_impl!(A, B, C, D, E, F, G, HT, I, J);
523
tuple_impl!(A, B, C, D, E, F, G, HT, I, J, K);
524
tuple_impl!(A, B, C, D, E, F, G, HT, I, J, K, L);