# Releases

## 2.2.6

- Added trait `MutableValues` for opt-in mutable access to set values.

## 2.2.5

- Added optional `borsh` serialization support.

## 2.2.4

- Added an `insert_sorted` method on `IndexMap`, `IndexSet`, and `VacantEntry`.
- Avoid hashing for lookups in single-entry maps.
- Limit preallocated memory in `serde` deserializers.

## 2.2.3

- Added `move_index` and `swap_indices` methods to `IndexedEntry`,
  `OccupiedEntry`, and `RawOccupiedEntryMut`, functioning like the existing
  methods on `IndexMap`.
- Added `shift_insert` methods on `VacantEntry` and `RawVacantEntryMut`, as
  well as `shift_insert_hashed_nocheck` on the latter, to insert the new entry
  at a particular index.
- Added `shift_insert` methods on `IndexMap` and `IndexSet` to insert a new
  entry at a particular index, or else move an existing entry there.

## 2.2.2

- Added indexing methods to raw entries: `RawEntryBuilder::from_hash_full`,
  `RawEntryBuilder::index_from_hash`, and `RawEntryMut::index`.

## 2.2.1

- Corrected the signature of `RawOccupiedEntryMut::into_key(self) -> &'a mut K`,
  This a breaking change from 2.2.0, but that version was published for less
  than a day and has now been yanked.

## 2.2.0

- The new `IndexMap::get_index_entry` method finds an entry by its index for
  in-place manipulation.

- The `Keys` iterator now implements `Index<usize>` for quick access to the
  entry's key, compared to indexing the map to get the value.

- The new `IndexMap::splice` and `IndexSet::splice` methods will drain the
  given range as an iterator, and then replace that range with entries from
  an input iterator.

- The new trait `RawEntryApiV1` offers opt-in access to a raw entry API for
  `IndexMap`, corresponding to the unstable API on `HashSet` as of Rust 1.75.

- Many `IndexMap` and `IndexSet` methods have relaxed their type constraints,
  e.g. removing `K: Hash` on methods that don't actually need to hash.

- Removal methods `remove`, `remove_entry`, and `take` are now deprecated
  in favor of their `shift_` or `swap_` prefixed variants, which are more
  explicit about their effect on the index and order of remaining items.
  The deprecated methods will remain to guide drop-in replacements from
  `HashMap` and `HashSet` toward the prefixed methods.

## 2.1.0

- Empty slices can now be created with `map::Slice::{new, new_mut}` and
  `set::Slice::new`. In addition, `Slice::new`, `len`, and `is_empty` are
  now `const` functions on both types.

- `IndexMap`, `IndexSet`, and their respective `Slice`s all have binary
  search methods for sorted data: map `binary_search_keys` and set
  `binary_search` for plain comparison, `binary_search_by` for custom
  comparators, `binary_search_by_key` for key extraction, and
  `partition_point` for boolean conditions.

## 2.0.2

- The `hashbrown` dependency has been updated to version 0.14.1 to
  complete the support for Rust 1.63.

## 2.0.1

- **MSRV**: Rust 1.63.0 is now supported as well, pending publication of
  `hashbrown`'s relaxed MSRV (or use cargo `--ignore-rust-version`).

## 2.0.0

- **MSRV**: Rust 1.64.0 or later is now required.

- The `"std"` feature is no longer auto-detected. It is included in the
  default feature set, or else can be enabled like any other Cargo feature.

- The `"serde-1"` feature has been removed, leaving just the optional
  `"serde"` dependency to be enabled like a feature itself.

- `IndexMap::get_index_mut` now returns `Option<(&K, &mut V)>`, changing
  the key part from `&mut K` to `&K`. There is also a new alternative
  `MutableKeys::get_index_mut2` to access the former behavior.

- The new `map::Slice<K, V>` and `set::Slice<T>` offer a linear view of maps
  and sets, behaving a lot like normal `[(K, V)]` and `[T]` slices. Notably,
  comparison traits like `Eq` only consider items in order, rather than hash
  lookups, and slices even implement `Hash`.

- `IndexMap` and `IndexSet` now have `sort_by_cached_key` and
  `par_sort_by_cached_key` methods which perform stable sorts in place
  using a key extraction function.

- `IndexMap` and `IndexSet` now have `reserve_exact`, `try_reserve`, and
  `try_reserve_exact` methods that correspond to the same methods on `Vec`.
  However, exactness only applies to the direct capacity for items, while the
  raw hash table still follows its own rules for capacity and load factor.

- The `Equivalent` trait is now re-exported from the `equivalent` crate,
  intended as a common base to allow types to work with multiple map types.

- The `hashbrown` dependency has been updated to version 0.14.

- The `serde_seq` module has been moved from the crate root to below the
  `map` module.

## 1.9.3

- Bump the `rustc-rayon` dependency, for compiler use only.

## 1.9.2

- `IndexMap` and `IndexSet` both implement `arbitrary::Arbitrary<'_>` and
  `quickcheck::Arbitrary` if those optional dependency features are enabled.

## 1.9.1

- The MSRV now allows Rust 1.56.0 as well. However, currently `hashbrown`
  0.12.1 requires 1.56.1, so users on 1.56.0 should downgrade that to 0.12.0
  until there is a later published version relaxing its requirement.

## 1.9.0

- **MSRV**: Rust 1.56.1 or later is now required.

- The `hashbrown` dependency has been updated to version 0.12.

- `IterMut` and `ValuesMut` now implement `Debug`.

- The new `IndexMap::shrink_to` and `IndexSet::shrink_to` methods shrink
  the capacity with a lower bound.

- The new `IndexMap::move_index` and `IndexSet::move_index` methods change
  the position of an item from one index to another, shifting the items
  between to accommodate the move.

## 1.8.2

- Bump the `rustc-rayon` dependency, for compiler use only.

## 1.8.1

- The new `IndexSet::replace_full` will return the index of the item along
  with the replaced value, if any, by @zakcutner in PR [222].

[222]: https://github.com/indexmap-rs/indexmap/pull/222

## 1.8.0

- The new `IndexMap::into_keys` and `IndexMap::into_values` will consume
  the map into keys or values, respectively, matching Rust 1.54's `HashMap`
  methods, by @taiki-e in PR [195].

- More of the iterator types implement `Debug`, `ExactSizeIterator`, and
  `FusedIterator`, by @cuviper in PR [196].

- `IndexMap` and `IndexSet` now implement rayon's `ParallelDrainRange`,
  by @cuviper in PR [197].

- `IndexMap::with_hasher` and `IndexSet::with_hasher` are now `const`
  functions, allowing static maps and sets, by @mwillsey in PR [203].

- `IndexMap` and `IndexSet` now implement `From` for arrays, matching
  Rust 1.56's implementation for `HashMap`, by @rouge8 in PR [205].

- `IndexMap` and `IndexSet` now have methods `sort_unstable_keys`,
  `sort_unstable_by`, `sorted_unstable_by`, and `par_*` equivalents,
  which sort in-place without preserving the order of equal items, by
  @bhgomes in PR [211].

[195]: https://github.com/indexmap-rs/indexmap/pull/195
[196]: https://github.com/indexmap-rs/indexmap/pull/196
[197]: https://github.com/indexmap-rs/indexmap/pull/197
[203]: https://github.com/indexmap-rs/indexmap/pull/203
[205]: https://github.com/indexmap-rs/indexmap/pull/205
[211]: https://github.com/indexmap-rs/indexmap/pull/211

## 1.7.0

- **MSRV**: Rust 1.49 or later is now required.

- The `hashbrown` dependency has been updated to version 0.11.

## 1.6.2

- Fixed to match `std` behavior, `OccupiedEntry::key` now references the
  existing key in the map instead of the lookup key, by @cuviper in PR [170].

- The new `Entry::or_insert_with_key` matches Rust 1.50's `Entry` method,
  passing `&K` to the callback to create a value, by @cuviper in PR [175].

[170]: https://github.com/indexmap-rs/indexmap/pull/170
[175]: https://github.com/indexmap-rs/indexmap/pull/175

## 1.6.1

- The new `serde_seq` module implements `IndexMap` serialization as a
  sequence to ensure order is preserved, by @cuviper in PR [158].

- New methods on maps and sets work like the `Vec`/slice methods by the same name:
  `truncate`, `split_off`, `first`, `first_mut`, `last`, `last_mut`, and
  `swap_indices`, by @cuviper in PR [160].

[158]: https://github.com/indexmap-rs/indexmap/pull/158
[160]: https://github.com/indexmap-rs/indexmap/pull/160

## 1.6.0

- **MSRV**: Rust 1.36 or later is now required.

- The `hashbrown` dependency has been updated to version 0.9.

## 1.5.2

- The new "std" feature will force the use of `std` for users that explicitly
  want the default `S = RandomState`, bypassing the autodetection added in 1.3.0,
  by @cuviper in PR [145].

[145]: https://github.com/indexmap-rs/indexmap/pull/145

## 1.5.1

- Values can now be indexed by their `usize` position by @cuviper in PR [132].

- Some of the generic bounds have been relaxed to match `std` by @cuviper in PR [141].

- `drain` now accepts any `R: RangeBounds<usize>` by @cuviper in PR [142].

[132]: https://github.com/indexmap-rs/indexmap/pull/132
[141]: https://github.com/indexmap-rs/indexmap/pull/141
[142]: https://github.com/indexmap-rs/indexmap/pull/142

## 1.5.0

- **MSRV**: Rust 1.32 or later is now required.

- The inner hash table is now based on `hashbrown` by @cuviper in PR [131].
  This also completes the method `reserve` and adds `shrink_to_fit`.

- Add new methods `get_key_value`, `remove_entry`, `swap_remove_entry`,
  and `shift_remove_entry`, by @cuviper in PR [136]

- `Clone::clone_from` reuses allocations by @cuviper in PR [125]

- Add new method `reverse` by @linclelinkpart5 in PR [128]

[125]: https://github.com/indexmap-rs/indexmap/pull/125
[128]: https://github.com/indexmap-rs/indexmap/pull/128
[131]: https://github.com/indexmap-rs/indexmap/pull/131
[136]: https://github.com/indexmap-rs/indexmap/pull/136

## 1.4.0

- Add new method `get_index_of` by @Thermatrix in PR [115] and [120]

- Fix build script rebuild-if-changed configuration to use "build.rs";
  fixes issue [123]. Fix by @cuviper.

- Dev-dependencies (rand and quickcheck) have been updated. The crate's tests
  now run using Rust 1.32 or later (MSRV for building the crate has not changed).
  by @kjeremy and @bluss

[123]: https://github.com/indexmap-rs/indexmap/issues/123
[115]: https://github.com/indexmap-rs/indexmap/pull/115
[120]: https://github.com/indexmap-rs/indexmap/pull/120

## 1.3.2

- Maintenance update to regenerate the published `Cargo.toml`.

## 1.3.1

- Maintenance update for formatting and `autocfg` 1.0.

## 1.3.0

- The deprecation messages in the previous version have been removed.
  (The methods have not otherwise changed.) Docs for removal methods have been
  improved.
- From Rust 1.36, this crate supports being built **without std**, requiring
  `alloc` instead. This is enabled automatically when it is detected that
  `std` is not available. There is no crate feature to enable/disable to
  trigger this. The new build-dep `autocfg` enables this.

## 1.2.0

- Plain `.remove()` now has a deprecation message, it informs the user
  about picking one of the removal functions `swap_remove` and `shift_remove`
  which have different performance and order semantics.
  Plain `.remove()` will not be removed, the warning message and method
  will remain until further.

- Add new method `shift_remove` for order preserving removal on the map,
  and `shift_take` for the corresponding operation on the set.

- Add methods `swap_remove`, `swap_remove_entry` to `Entry`.

- Fix indexset/indexmap to support full paths, like `indexmap::indexmap!()`

- Internal improvements: fix warnings, deprecations and style lints

## 1.1.0

- Added optional feature `"rayon"` that adds parallel iterator support
  to `IndexMap` and `IndexSet` using Rayon. This includes all the regular
  iterators in parallel versions, and parallel sort.

- Implemented `Clone` for `map::{Iter, Keys, Values}` and
  `set::{Difference, Intersection, Iter, SymmetricDifference, Union}`

- Implemented `Debug` for `map::{Entry, IntoIter, Iter, Keys, Values}` and
  `set::{Difference, Intersection, IntoIter, Iter, SymmetricDifference, Union}`

- Serde trait `IntoDeserializer` are implemented for `IndexMap` and `IndexSet`.

- Minimum Rust version requirement increased to Rust 1.30 for development builds.

## 1.0.2

- The new methods `IndexMap::insert_full` and `IndexSet::insert_full` are
  both like `insert` with the index included in the return value.

- The new method `Entry::and_modify` can be used to modify occupied
  entries, matching the new methods of `std` maps in Rust 1.26.

- The new method `Entry::or_default` inserts a default value in unoccupied
  entries, matching the new methods of `std` maps in Rust 1.28.

## 1.0.1

- Document Rust version policy for the crate (see rustdoc)

## 1.0.0

- This is the 1.0 release for `indexmap`! (the crate and datastructure
  formerly known as “ordermap”)
- `OccupiedEntry::insert` changed its signature, to use `&mut self` for
  the method receiver, matching the equivalent method for a standard
  `HashMap`.  Thanks to @dtolnay for finding this bug.
- The deprecated old names from ordermap were removed: `OrderMap`,
  `OrderSet`, `ordermap!{}`, `orderset!{}`. Use the new `IndexMap`
  etc names instead.

## 0.4.1

- Renamed crate to `indexmap`; the `ordermap` crate is now deprecated
  and the types `OrderMap/Set` now have a deprecation notice.

## 0.4.0

- This is the last release series for this `ordermap` under that name,
  because the crate is **going to be renamed** to `indexmap` (with types
  `IndexMap`, `IndexSet`) and no change in functionality!
- The map and its associated structs moved into the `map` submodule of the
  crate, so that the map and set are symmetric

    + The iterators, `Entry` and other structs are now under `ordermap::map::`

- Internally refactored `OrderMap<K, V, S>` so that all the main algorithms
  (insertion, lookup, removal etc) that don't use the `S` parameter (the
  hasher) are compiled without depending on `S`, which reduces generics bloat.

- `Entry<K, V>` no longer has a type parameter `S`, which is just like
  the standard `HashMap`'s entry.

- Minimum Rust version requirement increased to Rust 1.18

## 0.3.5

- Documentation improvements

## 0.3.4

- The `.retain()` methods for `OrderMap` and `OrderSet` now
  traverse the elements in order, and the retained elements **keep their order**
- Added new methods `.sort_by()`, `.sort_keys()` to `OrderMap` and
  `.sort_by()`, `.sort()` to `OrderSet`. These methods allow you to
  sort the maps in place efficiently.

## 0.3.3

- Document insertion behaviour better by @lucab
- Updated dependences (no feature changes) by @ignatenkobrain

## 0.3.2

- Add `OrderSet` by @cuviper!
- `OrderMap::drain` is now (too) a double ended iterator.

## 0.3.1

- In all ordermap iterators, forward the `collect` method to the underlying
  iterator as well.
- Add crates.io categories.

## 0.3.0

- The methods `get_pair`, `get_pair_index` were both replaced by
  `get_full` (and the same for the mutable case).
- Method `swap_remove_pair` replaced by `swap_remove_full`.
- Add trait `MutableKeys` for opt-in mutable key access. Mutable key access
  is only possible through the methods of this extension trait.
- Add new trait `Equivalent` for key equivalence. This extends the
  `Borrow` trait mechanism for `OrderMap::get` in a backwards compatible
  way, just some minor type inference related issues may become apparent.
  See [#10] for more information.
- Implement `Extend<(&K, &V)>` by @xfix.

[#10]: https://github.com/indexmap-rs/indexmap/pull/10

## 0.2.13

- Fix deserialization to support custom hashers by @Techcable.
- Add methods `.index()` on the entry types by @garro95.

## 0.2.12

- Add methods `.with_hasher()`, `.hasher()`.

## 0.2.11

- Support `ExactSizeIterator` for the iterators. By @Binero.
- Use `Box<[Pos]>` internally, saving a word in the `OrderMap` struct.
- Serde support, with crate feature `"serde-1"`. By @xfix.

## 0.2.10

- Add iterator `.drain(..)` by @stevej.

## 0.2.9

- Add method `.is_empty()` by @overvenus.
- Implement `PartialEq, Eq` by @overvenus.
- Add method `.sorted_by()`.

## 0.2.8

- Add iterators `.values()` and `.values_mut()`.
- Fix compatibility with 32-bit platforms.

## 0.2.7

- Add `.retain()`.

## 0.2.6

- Add `OccupiedEntry::remove_entry` and other minor entry methods,
  so that it now has all the features of `HashMap`'s entries.

## 0.2.5

- Improved `.pop()` slightly.

## 0.2.4

- Improved performance of `.insert()` ([#3]) by @pczarn.

[#3]: https://github.com/indexmap-rs/indexmap/pull/3

## 0.2.3

- Generalize `Entry` for now, so that it works on hashmaps with non-default
  hasher. However, there's a lingering compat issue since libstd `HashMap`
  does not parameterize its entries by the hasher (`S` typarm).
- Special case some iterator methods like `.nth()`.

## 0.2.2

- Disable the verbose `Debug` impl by default.

## 0.2.1

- Fix doc links and clarify docs.

## 0.2.0

- Add more `HashMap` methods & compat with its API.
- Experimental support for `.entry()` (the simplest parts of the API).
- Add `.reserve()` (placeholder impl).
- Add `.remove()` as synonym for `.swap_remove()`.
- Changed `.insert()` to swap value if the entry already exists, and
  return `Option`.
- Experimental support as an *indexed* hash map! Added methods
  `.get_index()`, `.get_index_mut()`, `.swap_remove_index()`,
  `.get_pair_index()`, `.get_pair_index_mut()`.

## 0.1.2

- Implement the 32/32 split idea for `Pos` which improves cache utilization
  and lookup performance.

## 0.1.1

- Initial release.
