- 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 comparision, `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/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.
