- 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/bluss/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/bluss/indexmap/pull/195
[196]: https://github.com/bluss/indexmap/pull/196
[197]: https://github.com/bluss/indexmap/pull/197
[203]: https://github.com/bluss/indexmap/pull/203
[205]: https://github.com/bluss/indexmap/pull/205
[211]: https://github.com/bluss/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/bluss/indexmap/pull/170
[175]: https://github.com/bluss/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/bluss/indexmap/pull/158
[160]: https://github.com/bluss/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/bluss/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/bluss/indexmap/pull/132
[141]: https://github.com/bluss/indexmap/pull/141
[142]: https://github.com/bluss/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/bluss/indexmap/pull/125
[128]: https://github.com/bluss/indexmap/pull/128
[131]: https://github.com/bluss/indexmap/pull/131
[136]: https://github.com/bluss/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/bluss/indexmap/issues/123
[115]: https://github.com/bluss/indexmap/pull/115
[120]: https://github.com/bluss/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/bluss/ordermap/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/bluss/ordermap/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.
