1# Change Log 2 3All notable changes to this project will be documented in this file. 4 5The format is based on [Keep a Changelog](https://keepachangelog.com/) 6and this project adheres to [Semantic Versioning](https://semver.org/). 7 8## [Unreleased] 9 10## [v0.12.3] - 2022-07-17 11 12## Fixed 13 14- Fixed double-drop in `RawTable::clone_from`. (#348) 15 16## [v0.12.2] - 2022-07-09 17 18## Added 19 20- Added `Entry` API for `HashSet`. (#342) 21- Added `Extend<&'a (K, V)> for HashMap<K, V, S, A>`. (#340) 22- Added length-based short-circuiting for hash table iteration. (#338) 23- Added a function to access the `RawTable` of a `HashMap`. (#335) 24 25## Changed 26 27- Edited `do_alloc` to reduce LLVM IR generated. (#341) 28 29## [v0.12.1] - 2022-05-02 30 31## Fixed 32 33- Fixed underflow in `RawIterRange::size_hint`. (#325) 34- Fixed the implementation of `Debug` for `ValuesMut` and `IntoValues`. (#325) 35 36## [v0.12.0] - 2022-01-17 37 38## Added 39 40- Added `From<[T; N]>` and `From<[(K, V); N]>` for `HashSet` and `HashMap` respectively. (#297) 41- Added an `allocator()` getter to HashMap and HashSet. (#257) 42- Added `insert_unique_unchecked` to `HashMap` and `HashSet`. (#293) 43- Added `into_keys` and `into_values` to HashMap. (#295) 44- Implement `From<array>` on `HashSet` and `HashMap`. (#298) 45- Added `entry_ref` API to `HashMap`. (#201) 46 47## Changed 48 49- Bumped minimum Rust version to 1.56.1 and edition to 2021. 50- Use u64 for the GroupWord on WebAssembly. (#271) 51- Optimized `find`. (#279) 52- Made rehashing and resizing less generic to reduce compilation time. (#282) 53- Inlined small functions. (#283) 54- Use `BuildHasher::hash_one` when `feature = "nightly"` is enabled. (#292) 55- Relaxed the bounds on `Debug` for `HashSet`. (#296) 56- Rename `get_each_mut` to `get_many_mut` and align API with the stdlib. (#291) 57- Don't hash the key when searching in an empty table. (#305) 58 59## Fixed 60 61- Guard against allocations exceeding isize::MAX. (#268) 62- Made `RawTable::insert_no_grow` unsafe. (#254) 63- Inline `static_empty`. (#280) 64- Fixed trait bounds on Send/Sync impls. (#303) 65 66## [v0.11.2] - 2021-03-25 67 68## Fixed 69 70- Added missing allocator type parameter to `HashMap`'s and `HashSet`'s `Clone` impls. (#252) 71 72## [v0.11.1] - 2021-03-20 73 74## Fixed 75 76- Added missing `pub` modifier to `BumpWrapper`. (#251) 77 78## [v0.11.0] - 2021-03-14 79 80## Added 81- Added safe `try_insert_no_grow` method to `RawTable`. (#229) 82- Added support for `bumpalo` as an allocator without the `nightly` feature. (#231) 83- Implemented `Default` for `RawTable`. (#237) 84- Added new safe methods `RawTable::get_each_mut`, `HashMap::get_each_mut`, and 85 `HashMap::get_each_key_value_mut`. (#239) 86- Added `From<HashMap<T, ()>>` for `HashSet<T>`. (#235) 87- Added `try_insert` method to `HashMap`. (#247) 88 89## Changed 90- The minimum Rust version has been bumped to 1.49.0. (#230) 91- Significantly improved compilation times by reducing the amount of generated IR. (#205) 92 93## Removed 94- We no longer re-export the unstable allocator items from the standard library, nor the stable shims approximating the same. (#227) 95- Removed hasher specialization support from `aHash`, which was resulting in inconsistent hashes being generated for a key. (#248) 96 97## Fixed 98- Fixed union length comparison. (#228) 99 100## ~~[v0.10.0] - 2021-01-16~~ 101 102This release was _yanked_ due to inconsistent hashes being generated with the `nightly` feature. (#248) 103 104## Changed 105- Parametrized `RawTable`, `HashSet` and `HashMap` over an allocator. (#133) 106- Improved branch prediction hints on stable. (#209) 107- Optimized hashing of primitive types with AHash using specialization. (#207) 108- Only instantiate `RawTable`'s reserve functions once per key-value. (#204) 109 110## [v0.9.1] - 2020-09-28 111 112## Added 113- Added safe methods to `RawTable` (#202): 114 - `get`: `find` and `as_ref` 115 - `get_mut`: `find` and `as_mut` 116 - `insert_entry`: `insert` and `as_mut` 117 - `remove_entry`: `find` and `remove` 118 - `erase_entry`: `find` and `erase` 119 120## Changed 121- Removed `from_key_hashed_nocheck`'s `Q: Hash`. (#200) 122- Made `RawTable::drain` safe. (#201) 123 124## [v0.9.0] - 2020-09-03 125 126### Fixed 127- `drain_filter` now removes and yields items that do match the predicate, 128 rather than items that don't. This is a **breaking change** to match the 129 behavior of the `drain_filter` methods in `std`. (#187) 130 131### Added 132- Added `replace_entry_with` to `OccupiedEntry`, and `and_replace_entry_with` to `Entry`. (#190) 133- Implemented `FusedIterator` and `size_hint` for `DrainFilter`. (#188) 134 135### Changed 136- The minimum Rust version has been bumped to 1.36 (due to `crossbeam` dependency). (#193) 137- Updated `ahash` dependency to 0.4. (#198) 138- `HashMap::with_hasher` and `HashSet::with_hasher` are now `const fn`. (#195) 139- Removed `T: Hash + Eq` and `S: BuildHasher` bounds on `HashSet::new`, 140 `with_capacity`, `with_hasher`, and `with_capacity_and_hasher`. (#185) 141 142## [v0.8.2] - 2020-08-08 143 144### Changed 145- Avoid closures to improve compile times. (#183) 146- Do not iterate to drop if empty. (#182) 147 148## [v0.8.1] - 2020-07-16 149 150### Added 151- Added `erase` and `remove` to `RawTable`. (#171) 152- Added `try_with_capacity` to `RawTable`. (#174) 153- Added methods that allow re-using a `RawIter` for `RawDrain`, 154 `RawIntoIter`, and `RawParIter`. (#175) 155- Added `reflect_remove` and `reflect_insert` to `RawIter`. (#175) 156- Added a `drain_filter` function to `HashSet`. (#179) 157 158### Changed 159- Deprecated `RawTable::erase_no_drop` in favor of `erase` and `remove`. (#176) 160- `insert_no_grow` is now exposed under the `"raw"` feature. (#180) 161 162## [v0.8.0] - 2020-06-18 163 164### Fixed 165- Marked `RawTable::par_iter` as `unsafe`. (#157) 166 167### Changed 168- Reduced the size of `HashMap`. (#159) 169- No longer create tables with a capacity of 1 element. (#162) 170- Removed `K: Eq + Hash` bounds on `retain`. (#163) 171- Pulled in `HashMap` changes from rust-lang/rust (#164): 172 - `extend_one` support on nightly. 173 - `CollectionAllocErr` renamed to `TryReserveError`. 174 - Added `HashSet::get_or_insert_owned`. 175 - `Default` for `HashSet` no longer requires `T: Eq + Hash` and `S: BuildHasher`. 176 177## [v0.7.2] - 2020-04-27 178 179### Added 180- Added `or_insert_with_key` to `Entry`. (#152) 181 182### Fixed 183- Partially reverted `Clone` optimization which was unsound. (#154) 184 185### Changed 186- Disabled use of `const-random` by default, which prevented reproducible builds. (#155) 187- Optimized `repeat` function. (#150) 188- Use `NonNull` for buckets, which improves codegen for iterators. (#148) 189 190## [v0.7.1] - 2020-03-16 191 192### Added 193- Added `HashMap::get_key_value_mut`. (#145) 194 195### Changed 196- Optimized `Clone` implementation. (#146) 197 198## [v0.7.0] - 2020-01-31 199 200### Added 201- Added a `drain_filter` function to `HashMap`. (#135) 202 203### Changed 204- Updated `ahash` dependency to 0.3. (#141) 205- Optimized set union and intersection. (#130) 206- `raw_entry` can now be used without requiring `S: BuildHasher`. (#123) 207- `RawTable::bucket_index` can now be used under the `raw` feature. (#128) 208 209## [v0.6.3] - 2019-10-31 210 211### Added 212- Added an `ahash-compile-time-rng` feature (enabled by default) which allows disabling the 213 `compile-time-rng` feature in `ahash` to work around a Cargo bug. (#125) 214 215## [v0.6.2] - 2019-10-23 216 217### Added 218- Added an `inline-more` feature (enabled by default) which allows choosing a tradeoff between 219 runtime performance and compilation time. (#119) 220 221## [v0.6.1] - 2019-10-04 222 223### Added 224- Added `Entry::insert` and `RawEntryMut::insert`. (#118) 225 226### Changed 227- `Group::static_empty` was changed from a `const` to a `static` (#116). 228 229## [v0.6.0] - 2019-08-13 230 231### Fixed 232- Fixed AHash accidentally depending on `std`. (#110) 233 234### Changed 235- The minimum Rust version has been bumped to 1.32 (due to `rand` dependency). 236 237## ~~[v0.5.1] - 2019-08-04~~ 238 239This release was _yanked_ due to a breaking change for users of `no-default-features`. 240 241### Added 242- The experimental and unsafe `RawTable` API is available under the "raw" feature. (#108) 243- Added entry-like methods for `HashSet`. (#98) 244 245### Changed 246- Changed the default hasher from FxHash to AHash. (#97) 247- `hashbrown` is now fully `no_std` on recent Rust versions (1.36+). (#96) 248 249### Fixed 250- We now avoid growing the table during insertions when it wasn't necessary. (#106) 251- `RawOccupiedEntryMut` now properly implements `Send` and `Sync`. (#100) 252- Relaxed `lazy_static` version. (#92) 253 254## [v0.5.0] - 2019-06-12 255 256### Fixed 257- Resize with a more conservative amount of space after deletions. (#86) 258 259### Changed 260- Exposed the Layout of the failed allocation in CollectionAllocErr::AllocErr. (#89) 261 262## [v0.4.0] - 2019-05-30 263 264### Fixed 265- Fixed `Send` trait bounds on `IterMut` not matching the libstd one. (#82) 266 267## [v0.3.1] - 2019-05-30 268 269### Fixed 270- Fixed incorrect use of slice in unsafe code. (#80) 271 272## [v0.3.0] - 2019-04-23 273 274### Changed 275- Changed shrink_to to not panic if min_capacity < capacity. (#67) 276 277### Fixed 278- Worked around emscripten bug emscripten-core/emscripten-fastcomp#258. (#66) 279 280## [v0.2.2] - 2019-04-16 281 282### Fixed 283- Inlined non-nightly lowest_set_bit_nonzero. (#64) 284- Fixed build on latest nightly. (#65) 285 286## [v0.2.1] - 2019-04-14 287 288### Changed 289- Use for_each in map Extend and FromIterator. (#58) 290- Improved worst-case performance of HashSet.is_subset. (#61) 291 292### Fixed 293- Removed incorrect debug_assert. (#60) 294 295## [v0.2.0] - 2019-03-31 296 297### Changed 298- The code has been updated to Rust 2018 edition. This means that the minimum 299 Rust version has been bumped to 1.31 (2018 edition). 300 301### Added 302- Added `insert_with_hasher` to the raw_entry API to allow `K: !(Hash + Eq)`. (#54) 303- Added support for using hashbrown as the hash table implementation in libstd. (#46) 304 305### Fixed 306- Fixed cargo build with minimal-versions. (#45) 307- Fixed `#[may_dangle]` attributes to match the libstd `HashMap`. (#46) 308- ZST keys and values are now handled properly. (#46) 309 310## [v0.1.8] - 2019-01-14 311 312### Added 313- Rayon parallel iterator support (#37) 314- `raw_entry` support (#31) 315- `#[may_dangle]` on nightly (#31) 316- `try_reserve` support (#31) 317 318### Fixed 319- Fixed variance on `IterMut`. (#31) 320 321## [v0.1.7] - 2018-12-05 322 323### Fixed 324- Fixed non-SSE version of convert_special_to_empty_and_full_to_deleted. (#32) 325- Fixed overflow in rehash_in_place. (#33) 326 327## [v0.1.6] - 2018-11-17 328 329### Fixed 330- Fixed compile error on nightly. (#29) 331 332## [v0.1.5] - 2018-11-08 333 334### Fixed 335- Fixed subtraction overflow in generic::Group::match_byte. (#28) 336 337## [v0.1.4] - 2018-11-04 338 339### Fixed 340- Fixed a bug in the `erase_no_drop` implementation. (#26) 341 342## [v0.1.3] - 2018-11-01 343 344### Added 345- Serde support. (#14) 346 347### Fixed 348- Make the compiler inline functions more aggressively. (#20) 349 350## [v0.1.2] - 2018-10-31 351 352### Fixed 353- `clear` segfaults when called on an empty table. (#13) 354 355## [v0.1.1] - 2018-10-30 356 357### Fixed 358- `erase_no_drop` optimization not triggering in the SSE2 implementation. (#3) 359- Missing `Send` and `Sync` for hash map and iterator types. (#7) 360- Bug when inserting into a table smaller than the group width. (#5) 361 362## v0.1.0 - 2018-10-29 363 364- Initial release 365 366[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.12.3...HEAD 367[v0.12.3]: https://github.com/rust-lang/hashbrown/compare/v0.12.2...v0.12.3 368[v0.12.2]: https://github.com/rust-lang/hashbrown/compare/v0.12.1...v0.12.2 369[v0.12.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.0...v0.12.1 370[v0.12.0]: https://github.com/rust-lang/hashbrown/compare/v0.11.2...v0.12.0 371[v0.11.2]: https://github.com/rust-lang/hashbrown/compare/v0.11.1...v0.11.2 372[v0.11.1]: https://github.com/rust-lang/hashbrown/compare/v0.11.0...v0.11.1 373[v0.11.0]: https://github.com/rust-lang/hashbrown/compare/v0.10.0...v0.11.0 374[v0.10.0]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...v0.10.0 375[v0.9.1]: https://github.com/rust-lang/hashbrown/compare/v0.9.0...v0.9.1 376[v0.9.0]: https://github.com/rust-lang/hashbrown/compare/v0.8.2...v0.9.0 377[v0.8.2]: https://github.com/rust-lang/hashbrown/compare/v0.8.1...v0.8.2 378[v0.8.1]: https://github.com/rust-lang/hashbrown/compare/v0.8.0...v0.8.1 379[v0.8.0]: https://github.com/rust-lang/hashbrown/compare/v0.7.2...v0.8.0 380[v0.7.2]: https://github.com/rust-lang/hashbrown/compare/v0.7.1...v0.7.2 381[v0.7.1]: https://github.com/rust-lang/hashbrown/compare/v0.7.0...v0.7.1 382[v0.7.0]: https://github.com/rust-lang/hashbrown/compare/v0.6.3...v0.7.0 383[v0.6.3]: https://github.com/rust-lang/hashbrown/compare/v0.6.2...v0.6.3 384[v0.6.2]: https://github.com/rust-lang/hashbrown/compare/v0.6.1...v0.6.2 385[v0.6.1]: https://github.com/rust-lang/hashbrown/compare/v0.6.0...v0.6.1 386[v0.6.0]: https://github.com/rust-lang/hashbrown/compare/v0.5.1...v0.6.0 387[v0.5.1]: https://github.com/rust-lang/hashbrown/compare/v0.5.0...v0.5.1 388[v0.5.0]: https://github.com/rust-lang/hashbrown/compare/v0.4.0...v0.5.0 389[v0.4.0]: https://github.com/rust-lang/hashbrown/compare/v0.3.1...v0.4.0 390[v0.3.1]: https://github.com/rust-lang/hashbrown/compare/v0.3.0...v0.3.1 391[v0.3.0]: https://github.com/rust-lang/hashbrown/compare/v0.2.2...v0.3.0 392[v0.2.2]: https://github.com/rust-lang/hashbrown/compare/v0.2.1...v0.2.2 393[v0.2.1]: https://github.com/rust-lang/hashbrown/compare/v0.2.0...v0.2.1 394[v0.2.0]: https://github.com/rust-lang/hashbrown/compare/v0.1.8...v0.2.0 395[v0.1.8]: https://github.com/rust-lang/hashbrown/compare/v0.1.7...v0.1.8 396[v0.1.7]: https://github.com/rust-lang/hashbrown/compare/v0.1.6...v0.1.7 397[v0.1.6]: https://github.com/rust-lang/hashbrown/compare/v0.1.5...v0.1.6 398[v0.1.5]: https://github.com/rust-lang/hashbrown/compare/v0.1.4...v0.1.5 399[v0.1.4]: https://github.com/rust-lang/hashbrown/compare/v0.1.3...v0.1.4 400[v0.1.3]: https://github.com/rust-lang/hashbrown/compare/v0.1.2...v0.1.3 401[v0.1.2]: https://github.com/rust-lang/hashbrown/compare/v0.1.1...v0.1.2 402[v0.1.1]: https://github.com/rust-lang/hashbrown/compare/v0.1.0...v0.1.1 403