- Added methods
Entry::insert_entry
andVacantEntry::insert_entry
, returning anOccupiedEntry
after insertion.
- Implemented
Clone
formap::IntoIter
andset::IntoIter
. - Updated the
hashbrown
dependency to version 0.15.
- Added an
insert_before
method toIndexMap
andIndexSet
, as an alternative toshift_insert
with different behavior on existing entries. - Added
first_entry
andlast_entry
methods toIndexMap
. - Added
From
implementations betweenIndexedEntry
andOccupiedEntry
.
- Added methods
IndexMap::append
andIndexSet::append
, moving all items from one map or set into another, and leaving the original capacity for reuse.
- Added trait
MutableEntryKey
for opt-in mutable access to map entry keys. - Added method
MutableKeys::iter_mut2
for opt-in mutable iteration of map keys and values.
- Added trait
MutableValues
for opt-in mutable access to set values.
- Added optional
borsh
serialization support.
- Added an
insert_sorted
method onIndexMap
,IndexSet
, andVacantEntry
. - Avoid hashing for lookups in single-entry maps.
- Limit preallocated memory in
serde
deserializers.
- Added
move_index
andswap_indices
methods toIndexedEntry
,OccupiedEntry
, andRawOccupiedEntryMut
, functioning like the existing methods onIndexMap
. - Added
shift_insert
methods onVacantEntry
andRawVacantEntryMut
, as well asshift_insert_hashed_nocheck
on the latter, to insert the new entry at a particular index. - Added
shift_insert
methods onIndexMap
andIndexSet
to insert a new entry at a particular index, or else move an existing entry there.
- Added indexing methods to raw entries:
RawEntryBuilder::from_hash_full
,RawEntryBuilder::index_from_hash
, andRawEntryMut::index
.
- 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.
-
The new
IndexMap::get_index_entry
method finds an entry by its index for in-place manipulation. -
The
Keys
iterator now implementsIndex<usize>
for quick access to the entry's key, compared to indexing the map to get the value. -
The new
IndexMap::splice
andIndexSet::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 forIndexMap
, corresponding to the unstable API onHashSet
as of Rust 1.75. -
Many
IndexMap
andIndexSet
methods have relaxed their type constraints, e.g. removingK: Hash
on methods that don't actually need to hash. -
Removal methods
remove
,remove_entry
, andtake
are now deprecated in favor of theirshift_
orswap_
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 fromHashMap
andHashSet
toward the prefixed methods.
-
Empty slices can now be created with
map::Slice::{new, new_mut}
andset::Slice::new
. In addition,Slice::new
,len
, andis_empty
are nowconst
functions on both types. -
IndexMap
,IndexSet
, and their respectiveSlice
s all have binary search methods for sorted data: mapbinary_search_keys
and setbinary_search
for plain comparison,binary_search_by
for custom comparators,binary_search_by_key
for key extraction, andpartition_point
for boolean conditions.
- The
hashbrown
dependency has been updated to version 0.14.1 to complete the support for Rust 1.63.
- MSRV: Rust 1.63.0 is now supported as well, pending publication of
hashbrown
's relaxed MSRV (or use cargo--ignore-rust-version
).
-
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 returnsOption<(&K, &mut V)>
, changing the key part from&mut K
to&K
. There is also a new alternativeMutableKeys::get_index_mut2
to access the former behavior. -
The new
map::Slice<K, V>
andset::Slice<T>
offer a linear view of maps and sets, behaving a lot like normal[(K, V)]
and[T]
slices. Notably, comparison traits likeEq
only consider items in order, rather than hash lookups, and slices even implementHash
. -
IndexMap
andIndexSet
now havesort_by_cached_key
andpar_sort_by_cached_key
methods which perform stable sorts in place using a key extraction function. -
IndexMap
andIndexSet
now havereserve_exact
,try_reserve
, andtry_reserve_exact
methods that correspond to the same methods onVec
. 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 theequivalent
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 themap
module.
- Bump the
rustc-rayon
dependency, for compiler use only.
IndexMap
andIndexSet
both implementarbitrary::Arbitrary<'_>
andquickcheck::Arbitrary
if those optional dependency features are enabled.
- 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.
-
MSRV: Rust 1.56.1 or later is now required.
-
The
hashbrown
dependency has been updated to version 0.12. -
IterMut
andValuesMut
now implementDebug
. -
The new
IndexMap::shrink_to
andIndexSet::shrink_to
methods shrink the capacity with a lower bound. -
The new
IndexMap::move_index
andIndexSet::move_index
methods change the position of an item from one index to another, shifting the items between to accommodate the move.
- Bump the
rustc-rayon
dependency, for compiler use only.
- The new
IndexSet::replace_full
will return the index of the item along with the replaced value, if any, by @zakcutner in PR 222.
-
The new
IndexMap::into_keys
andIndexMap::into_values
will consume the map into keys or values, respectively, matching Rust 1.54'sHashMap
methods, by @taiki-e in PR 195. -
More of the iterator types implement
Debug
,ExactSizeIterator
, andFusedIterator
, by @cuviper in PR 196. -
IndexMap
andIndexSet
now implement rayon'sParallelDrainRange
, by @cuviper in PR 197. -
IndexMap::with_hasher
andIndexSet::with_hasher
are nowconst
functions, allowing static maps and sets, by @mwillsey in PR 203. -
IndexMap
andIndexSet
now implementFrom
for arrays, matching Rust 1.56's implementation forHashMap
, by @rouge8 in PR 205. -
IndexMap
andIndexSet
now have methodssort_unstable_keys
,sort_unstable_by
,sorted_unstable_by
, andpar_*
equivalents, which sort in-place without preserving the order of equal items, by @bhgomes in PR 211.
-
MSRV: Rust 1.49 or later is now required.
-
The
hashbrown
dependency has been updated to version 0.11.
-
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'sEntry
method, passing&K
to the callback to create a value, by @cuviper in PR 175.
-
The new
serde_seq
module implementsIndexMap
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
, andswap_indices
, by @cuviper in PR 160.
-
MSRV: Rust 1.36 or later is now required.
-
The
hashbrown
dependency has been updated to version 0.9.
- The new "std" feature will force the use of
std
for users that explicitly want the defaultS = RandomState
, bypassing the autodetection added in 1.3.0, by @cuviper in PR 145.
-
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 anyR: RangeBounds<usize>
by @cuviper in PR 142.
-
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 methodreserve
and addsshrink_to_fit
. -
Add new methods
get_key_value
,remove_entry
,swap_remove_entry
, andshift_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
-
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
- Maintenance update to regenerate the published
Cargo.toml
.
- Maintenance update for formatting and
autocfg
1.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 thatstd
is not available. There is no crate feature to enable/disable to trigger this. The new build-depautocfg
enables this.
-
Plain
.remove()
now has a deprecation message, it informs the user about picking one of the removal functionsswap_remove
andshift_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, andshift_take
for the corresponding operation on the set. -
Add methods
swap_remove
,swap_remove_entry
toEntry
. -
Fix indexset/indexmap to support full paths, like
indexmap::indexmap!()
-
Internal improvements: fix warnings, deprecations and style lints
-
Added optional feature
"rayon"
that adds parallel iterator support toIndexMap
andIndexSet
using Rayon. This includes all the regular iterators in parallel versions, and parallel sort. -
Implemented
Clone
formap::{Iter, Keys, Values}
andset::{Difference, Intersection, Iter, SymmetricDifference, Union}
-
Implemented
Debug
formap::{Entry, IntoIter, Iter, Keys, Values}
andset::{Difference, Intersection, IntoIter, Iter, SymmetricDifference, Union}
-
Serde trait
IntoDeserializer
are implemented forIndexMap
andIndexSet
. -
Minimum Rust version requirement increased to Rust 1.30 for development builds.
-
The new methods
IndexMap::insert_full
andIndexSet::insert_full
are both likeinsert
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 ofstd
maps in Rust 1.26. -
The new method
Entry::or_default
inserts a default value in unoccupied entries, matching the new methods ofstd
maps in Rust 1.28.
- Document Rust version policy for the crate (see rustdoc)
- 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 standardHashMap
. Thanks to @dtolnay for finding this bug.- The deprecated old names from ordermap were removed:
OrderMap
,OrderSet
,ordermap!{}
,orderset!{}
. Use the newIndexMap
etc names instead.
- Renamed crate to
indexmap
; theordermap
crate is now deprecated and the typesOrderMap/Set
now have a deprecation notice.
-
This is the last release series for this
ordermap
under that name, because the crate is going to be renamed toindexmap
(with typesIndexMap
,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 underordermap::map::
- The iterators,
-
Internally refactored
OrderMap<K, V, S>
so that all the main algorithms (insertion, lookup, removal etc) that don't use theS
parameter (the hasher) are compiled without depending onS
, which reduces generics bloat. -
Entry<K, V>
no longer has a type parameterS
, which is just like the standardHashMap
's entry. -
Minimum Rust version requirement increased to Rust 1.18
- Documentation improvements
- The
.retain()
methods forOrderMap
andOrderSet
now traverse the elements in order, and the retained elements keep their order - Added new methods
.sort_by()
,.sort_keys()
toOrderMap
and.sort_by()
,.sort()
toOrderSet
. These methods allow you to sort the maps in place efficiently.
- Document insertion behaviour better by @lucab
- Updated dependences (no feature changes) by @ignatenkobrain
- Add
OrderSet
by @cuviper! OrderMap::drain
is now (too) a double ended iterator.
- In all ordermap iterators, forward the
collect
method to the underlying iterator as well. - Add crates.io categories.
- The methods
get_pair
,get_pair_index
were both replaced byget_full
(and the same for the mutable case). - Method
swap_remove_pair
replaced byswap_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 theBorrow
trait mechanism forOrderMap::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.
- Fix deserialization to support custom hashers by @Techcable.
- Add methods
.index()
on the entry types by @garro95.
- Add methods
.with_hasher()
,.hasher()
.
- Support
ExactSizeIterator
for the iterators. By @Binero. - Use
Box<[Pos]>
internally, saving a word in theOrderMap
struct. - Serde support, with crate feature
"serde-1"
. By @xfix.
- Add iterator
.drain(..)
by @stevej.
- Add method
.is_empty()
by @overvenus. - Implement
PartialEq, Eq
by @overvenus. - Add method
.sorted_by()
.
- Add iterators
.values()
and.values_mut()
. - Fix compatibility with 32-bit platforms.
- Add
.retain()
.
- Add
OccupiedEntry::remove_entry
and other minor entry methods, so that it now has all the features ofHashMap
's entries.
- Improved
.pop()
slightly.
- Improved performance of
.insert()
(#3) by @pczarn.
- Generalize
Entry
for now, so that it works on hashmaps with non-default hasher. However, there's a lingering compat issue since libstdHashMap
does not parameterize its entries by the hasher (S
typarm). - Special case some iterator methods like
.nth()
.
- Disable the verbose
Debug
impl by default.
- Fix doc links and clarify docs.
- 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 returnOption
. - Experimental support as an indexed hash map! Added methods
.get_index()
,.get_index_mut()
,.swap_remove_index()
,.get_pair_index()
,.get_pair_index_mut()
.
- Implement the 32/32 split idea for
Pos
which improves cache utilization and lookup performance.
- Initial release.