      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

    //! This crate is a Rust port of Google's high-performance [SwissTable] hash
    //! map, adapted to make it a drop-in replacement for Rust's standard `HashMap`
    //! and `HashSet` types.
    //!
    //! The original C++ version of [SwissTable] can be found [here], and this
    //! [CppCon talk] gives an overview of how the algorithm works.
    //!
    //! [SwissTable]: https://abseil.io/blog/20180927-swisstables
    //! [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h
    //! [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4

    #![no_std]
    #![cfg_attr(
        feature = "nightly",
        feature(test, core_intrinsics, dropck_eyepatch, min_specialization, extend_one)
    )]
    #![allow(
        clippy::doc_markdown,
        clippy::module_name_repetitions,
        clippy::must_use_candidate,
        clippy::option_if_let_else
    )]
    #![warn(missing_docs)]
    #![warn(rust_2018_idioms)]

    #[cfg(test)]
    #[macro_use]
    extern crate std;

    #[cfg_attr(test, macro_use)]
    extern crate alloc;

    #[cfg(feature = "nightly")]
    #[cfg(doctest)]
    doc_comment::doctest!("../README.md");

    #[macro_use]
    mod macros;

    #[cfg(feature = "raw")]
    /// Experimental and unsafe `RawTable` API. This module is only available if the
    /// `raw` feature is enabled.
    pub mod raw {
        // The RawTable API is still experimental and is not properly documented yet.
        #[allow(missing_docs)]
        #[path = "mod.rs"]
        mod inner;
        pub use inner::*;

        #[cfg(feature = "rayon")]
        pub mod rayon {
            pub use crate::external_trait_impls::rayon::raw::*;
        }
    }
    #[cfg(not(feature = "raw"))]
    mod raw;

    mod external_trait_impls;
    mod map;
    #[cfg(feature = "rustc-internal-api")]
    mod rustc_entry;
    mod scopeguard;
    mod set;

    pub mod hash_map {
        //! A hash map implemented with quadratic probing and SIMD lookup.
        pub use crate::map::*;

        #[cfg(feature = "rustc-internal-api")]
        pub use crate::rustc_entry::*;

        #[cfg(feature = "rayon")]
        /// [rayon]-based parallel iterator types for hash maps.
        /// You will rarely need to interact with it directly unless you have need
        /// to name one of the iterator types.
        ///
        /// [rayon]: https://docs.rs/rayon/1.0/rayon
        pub mod rayon {
            pub use crate::external_trait_impls::rayon::map::*;
        }
    }
    pub mod hash_set {
        //! A hash set implemented as a `HashMap` where the value is `()`.
        pub use crate::set::*;

        #[cfg(feature = "rayon")]
        /// [rayon]-based parallel iterator types for hash sets.
        /// You will rarely need to interact with it directly unless you have need
        /// to name one of the iterator types.
        ///
        /// [rayon]: https://docs.rs/rayon/1.0/rayon
        pub mod rayon {
            pub use crate::external_trait_impls::rayon::set::*;
        }
    }

    pub use crate::map::HashMap;
    pub use crate::set::HashSet;

    /// The error type for `try_reserve` methods.
    #[derive(Clone, PartialEq, Eq, Debug)]
    pub enum TryReserveError {
        /// Error due to the computed capacity exceeding the collection's maximum
        /// (usually `isize::MAX` bytes).
        CapacityOverflow,

        /// The memory allocator returned an error
        AllocError {
            /// The layout of the allocation request that failed.
            layout: alloc::alloc::Layout,
        },
    }