Visitar URL original
Merge pull request #449 from cuviper/release-2.14.1 · indexmap-rs/indexmap@fdf7e17 · GitHub
Skip to content

Commit fdf7e17

Browse files
authored
Merge pull request #449 from cuviper/release-2.14.1
Release 2.14.1
2 parents b8a4187 + ada540e commit fdf7e17

10 files changed

Lines changed: 60 additions & 65 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
bench: test build benchmarks
4040

4141
steps:
42-
- uses: actions/checkout@v4
42+
- uses: actions/checkout@v7
4343
- uses: dtolnay/rust-toolchain@master
4444
with:
4545
toolchain: ${{ matrix.rust }}
@@ -72,7 +72,7 @@ jobs:
7272
target: thumbv6m-none-eabi
7373

7474
steps:
75-
- uses: actions/checkout@v4
75+
- uses: actions/checkout@v7
7676
- uses: dtolnay/rust-toolchain@master
7777
with:
7878
toolchain: ${{ matrix.rust }}
@@ -85,7 +85,7 @@ jobs:
8585
clippy:
8686
runs-on: ubuntu-latest
8787
steps:
88-
- uses: actions/checkout@v4
88+
- uses: actions/checkout@v7
8989
- uses: dtolnay/rust-toolchain@beta
9090
with:
9191
components: clippy
@@ -94,7 +94,7 @@ jobs:
9494
miri:
9595
runs-on: ubuntu-latest
9696
steps:
97-
- uses: actions/checkout@v4
97+
- uses: actions/checkout@v7
9898
- uses: dtolnay/rust-toolchain@nightly
9999
with:
100100
components: miri, rust-src
@@ -110,7 +110,7 @@ jobs:
110110
name: Check MSRV and minimal-versions
111111
runs-on: ubuntu-latest
112112
steps:
113-
- uses: actions/checkout@v4
113+
- uses: actions/checkout@v7
114114
- uses: dtolnay/rust-toolchain@nightly
115115
- uses: dtolnay/rust-toolchain@1.85.0 # MSRV
116116
- uses: taiki-e/install-action@v2

‎Cargo.toml‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "indexmap"
33
edition = "2024"
4-
version = "2.14.0"
4+
version = "2.14.1"
55
documentation = "https://docs.rs/indexmap/"
66
repository = "https://github.com/indexmap-rs/indexmap"
77
license = "Apache-2.0 OR MIT"
@@ -62,15 +62,15 @@ rustdoc-args = ["--cfg", "docsrs"]
6262
members = ["test-nostd", "test-serde", "test-sval"]
6363

6464
[lints.rust]
65-
private-bounds = "deny"
66-
private-interfaces = "deny"
67-
unnameable-types = "deny"
68-
unreachable-pub = "deny"
65+
private_bounds = "deny"
66+
private_interfaces = "deny"
67+
unnameable_types = "deny"
68+
unreachable_pub = "deny"
6969

7070
# We *mostly* avoid unsafe code, but there are a few fine-grained cases allowed
71-
unsafe-code = "deny"
71+
unsafe_code = "deny"
7272

73-
rust-2018-idioms = "warn"
73+
rust_2018_idioms = { level = "warn", priority = -1 }
7474

7575
[lints.clippy]
7676
style = "allow"

‎RELEASES.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Releases
22

3+
## 2.14.1 (2026-08-28)
4+
5+
- Simplify comparisons where `Equivalent` isn't needed (`Q = K`).
6+
- Unify index assertions for bounds checks.
7+
- Fix (or `expect`) clippy lints.
8+
39
## 2.14.0 (2026-04-09)
410

511
- **MSRV**: Rust 1.85.0 or later is now required.

‎benches/bench.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ fn lookup_hashmap_10_000_exist(b: &mut Bencher) {
289289
}
290290
b.iter(|| {
291291
let mut found = 0;
292+
#[expect(clippy::unnecessary_get_then_check)]
292293
for key in 5000..c {
293294
found += map.get(&key).is_some() as i32;
294295
}
@@ -306,6 +307,7 @@ fn lookup_hashmap_10_000_noexist(b: &mut Bencher) {
306307
}
307308
b.iter(|| {
308309
let mut found = 0;
310+
#[expect(clippy::unnecessary_get_then_check)]
309311
for key in c..15000 {
310312
found += map.get(&key).is_some() as i32;
311313
}

‎benches/faststring.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ fn lookup_hashmap_10_000_exist_string(b: &mut Bencher) {
117117
let lookups = (5000..c).map(|x| x.to_string()).collect::<Vec<_>>();
118118
b.iter(|| {
119119
let mut found = 0;
120+
#[expect(clippy::unnecessary_get_then_check)]
120121
for key in &lookups {
121122
found += map.get(key).is_some() as i32;
122123
}
@@ -137,6 +138,7 @@ fn lookup_hashmap_10_000_exist_string_oneshot(b: &mut Bencher) {
137138
.collect::<Vec<_>>();
138139
b.iter(|| {
139140
let mut found = 0;
141+
#[expect(clippy::unnecessary_get_then_check)]
140142
for key in &lookups {
141143
found += map.get(key).is_some() as i32;
142144
}

‎src/map/slice.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ mod tests {
578578
let slice = map.as_slice();
579579

580580
// RangeFull
581+
#[expect(clippy::redundant_slicing)]
581582
check(&vec[..], &map[..], &slice[..]);
582583

583584
for i in 0usize..10 {

‎src/map/tests.rs‎

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ fn insert() {
4343

4444
#[test]
4545
fn insert_full() {
46-
let insert = vec![9, 2, 7, 1, 4, 6, 13];
47-
let present = vec![1, 6, 2];
46+
let insert = [9, 2, 7, 1, 4, 6, 13];
47+
let present = [1, 6, 2];
4848
let mut map = IndexMap::with_capacity(insert.len());
4949

5050
for (i, &elt) in insert.iter().enumerate() {
@@ -207,10 +207,10 @@ fn reserve() {
207207
assert_eq!(map.capacity(), capacity);
208208
assert_eq!(map.get(&i), Some(&(i * i)));
209209
}
210-
map.insert(capacity, std::usize::MAX);
210+
map.insert(capacity, usize::MAX);
211211
assert_eq!(map.len(), capacity + 1);
212212
assert!(map.capacity() > capacity);
213-
assert_eq!(map.get(&capacity), Some(&std::usize::MAX));
213+
assert_eq!(map.get(&capacity), Some(&usize::MAX));
214214
}
215215

216216
#[test]
@@ -230,7 +230,7 @@ fn shrink_to_fit() {
230230
assert_eq!(map.len(), i);
231231
map.insert(i, i * i);
232232
assert_eq!(map.len(), i + 1);
233-
assert!(map.capacity() >= i + 1);
233+
assert!(map.capacity() > i);
234234
assert_eq!(map.get(&i), Some(&(i * i)));
235235
map.shrink_to_fit();
236236
assert_eq!(map.len(), i + 1);
@@ -327,11 +327,11 @@ fn partial_eq_and_eq() {
327327
#[test]
328328
fn extend() {
329329
let mut map = IndexMap::new();
330-
map.extend(vec![(&1, &2), (&3, &4)]);
331-
map.extend(vec![(5, 6)]);
330+
map.extend([(&1, &2), (&3, &4)]);
331+
map.extend([(5, 6)]);
332332
assert_eq!(
333333
map.into_iter().collect::<Vec<_>>(),
334-
vec![(1, 2), (3, 4), (5, 6)]
334+
[(1, 2), (3, 4), (5, 6)]
335335
);
336336
}
337337

@@ -374,18 +374,13 @@ fn entry_and_modify() {
374374
fn entry_or_default() {
375375
let mut map = IndexMap::new();
376376

377-
#[derive(Debug, PartialEq)]
377+
#[derive(Debug, Default, PartialEq)]
378378
enum TestEnum {
379+
#[default]
379380
DefaultValue,
380381
NonDefaultValue,
381382
}
382383

383-
impl Default for TestEnum {
384-
fn default() -> Self {
385-
TestEnum::DefaultValue
386-
}
387-
}
388-
389384
map.insert(1, TestEnum::NonDefaultValue);
390385
assert_eq!(&mut TestEnum::NonDefaultValue, map.entry(1).or_default());
391386

@@ -485,8 +480,7 @@ fn from_entries() {
485480

486481
#[test]
487482
fn keys() {
488-
let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
489-
let map: IndexMap<_, _> = vec.into_iter().collect();
483+
let map = IndexMap::<_, _>::from_iter([(1, 'a'), (2, 'b'), (3, 'c')]);
490484
let keys: Vec<_> = map.keys().copied().collect();
491485
assert_eq!(keys.len(), 3);
492486
assert!(keys.contains(&1));
@@ -496,8 +490,7 @@ fn keys() {
496490

497491
#[test]
498492
fn into_keys() {
499-
let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
500-
let map: IndexMap<_, _> = vec.into_iter().collect();
493+
let map = IndexMap::<_, _>::from_iter([(1, 'a'), (2, 'b'), (3, 'c')]);
501494
let keys: Vec<i32> = map.into_keys().collect();
502495
assert_eq!(keys.len(), 3);
503496
assert!(keys.contains(&1));
@@ -507,8 +500,7 @@ fn into_keys() {
507500

508501
#[test]
509502
fn values() {
510-
let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
511-
let map: IndexMap<_, _> = vec.into_iter().collect();
503+
let map = IndexMap::<_, _>::from_iter([(1, 'a'), (2, 'b'), (3, 'c')]);
512504
let values: Vec<_> = map.values().copied().collect();
513505
assert_eq!(values.len(), 3);
514506
assert!(values.contains(&'a'));
@@ -518,8 +510,7 @@ fn values() {
518510

519511
#[test]
520512
fn values_mut() {
521-
let vec = vec![(1, 1), (2, 2), (3, 3)];
522-
let mut map: IndexMap<_, _> = vec.into_iter().collect();
513+
let mut map = IndexMap::<_, _>::from_iter([(1, 1), (2, 2), (3, 3)]);
523514
for value in map.values_mut() {
524515
*value *= 2
525516
}
@@ -532,8 +523,7 @@ fn values_mut() {
532523

533524
#[test]
534525
fn into_values() {
535-
let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
536-
let map: IndexMap<_, _> = vec.into_iter().collect();
526+
let map = IndexMap::<_, _>::from_iter([(1, 'a'), (2, 'b'), (3, 'c')]);
537527
let values: Vec<char> = map.into_values().collect();
538528
assert_eq!(values.len(), 3);
539529
assert!(values.contains(&'a'));
@@ -698,8 +688,7 @@ fn shift_remove_full() {
698688

699689
#[test]
700690
fn sorted_unstable_by() {
701-
let mut map: IndexMap<i32, i32> = IndexMap::new();
702-
map.extend(vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]);
691+
let map = IndexMap::<i32, i32>::from_iter([(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]);
703692
let sorted = map.sorted_unstable_by(|_a, b, _c, d| d.cmp(&b));
704693

705694
assert_eq!(
@@ -750,28 +739,24 @@ fn insert_before_oob() {
750739

751740
#[test]
752741
fn clear() {
753-
let mut map: IndexMap<i32, i32> = IndexMap::new();
754-
map.extend(vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]);
742+
let mut map = IndexMap::<i32, i32>::from_iter([(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]);
743+
assert_ne!(map.len(), 0);
755744
map.clear();
756745
assert_eq!(map.len(), 0);
757746
}
758747

759748
#[test]
760749
fn get_range() {
761-
let mut index_map: IndexMap<i32, i32> = IndexMap::new();
762-
index_map.insert(1, 10);
763-
index_map.insert(2, 20);
764-
index_map.insert(3, 30);
765-
index_map.insert(4, 40);
766-
index_map.insert(5, 50);
750+
let map = IndexMap::<i32, i32>::from_iter([(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]);
767751

768-
let result = index_map.get_range(2..2);
752+
let result = map.get_range(2..2);
769753
assert!(result.unwrap().is_empty());
770754

771-
let result = index_map.get_range(4..2);
755+
#[expect(clippy::reversed_empty_ranges)]
756+
let result = map.get_range(4..2);
772757
assert!(result.is_none());
773758

774-
let result = index_map.get_range(2..4);
759+
let result = map.get_range(2..4);
775760
let slice: &Slice<i32, i32> = result.unwrap();
776761
assert_eq!(slice.len(), 2);
777762
assert_eq!(slice, &[(3, 30), (4, 40)]);
@@ -789,6 +774,7 @@ fn get_range_mut() {
789774
let result = index_map.get_range_mut(2..2);
790775
assert!(result.unwrap().is_empty());
791776

777+
#[expect(clippy::reversed_empty_ranges)]
792778
let result = index_map.get_range_mut(4..2);
793779
assert!(result.is_none());
794780

‎src/set/slice.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ mod tests {
394394
let slice = set.as_slice();
395395

396396
// RangeFull
397+
#[expect(clippy::redundant_slicing)]
397398
check(&vec[..], &set[..], &slice[..]);
398399

399400
for i in 0usize..10 {

‎src/set/tests.rs‎

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ fn insert() {
4242

4343
#[test]
4444
fn insert_full() {
45-
let insert = vec![9, 2, 7, 1, 4, 6, 13];
46-
let present = vec![1, 6, 2];
45+
let insert = [9, 2, 7, 1, 4, 6, 13];
46+
let present = [1, 6, 2];
4747
let mut set = IndexSet::with_capacity(insert.len());
4848

4949
for (i, &elt) in insert.iter().enumerate() {
@@ -90,8 +90,7 @@ fn insert_2() {
9090

9191
#[test]
9292
fn insert_dup() {
93-
let mut elements = vec![0, 2, 4, 6, 8];
94-
let mut set: IndexSet<u8> = elements.drain(..).collect();
93+
let mut set = IndexSet::<u8>::from_iter([0, 2, 4, 6, 8]);
9594
{
9695
let (i, v) = set.get_full(&0).unwrap();
9796
assert_eq!(set.len(), 5);
@@ -175,8 +174,8 @@ fn replace() {
175174

176175
#[test]
177176
fn replace_full() {
178-
let replace = vec![9, 2, 7, 1, 4, 6, 13];
179-
let present = vec![1, 6, 2];
177+
let replace = [9, 2, 7, 1, 4, 6, 13];
178+
let present = [1, 6, 2];
180179
let mut set = IndexSet::with_capacity(replace.len());
181180

182181
for (i, &elt) in replace.iter().enumerate() {
@@ -223,8 +222,7 @@ fn replace_2() {
223222

224223
#[test]
225224
fn replace_dup() {
226-
let mut elements = vec![0, 2, 4, 6, 8];
227-
let mut set: IndexSet<u8> = elements.drain(..).collect();
225+
let mut set = IndexSet::<u8>::from_iter([0, 2, 4, 6, 8]);
228226
{
229227
let (i, v) = set.get_full(&0).unwrap();
230228
assert_eq!(set.len(), 5);
@@ -338,7 +336,7 @@ fn shrink_to_fit() {
338336
assert_eq!(set.len(), i);
339337
set.insert(i);
340338
assert_eq!(set.len(), i + 1);
341-
assert!(set.capacity() >= i + 1);
339+
assert!(set.capacity() > i);
342340
assert_eq!(set.get(&i), Some(&i));
343341
set.shrink_to_fit();
344342
assert_eq!(set.len(), i + 1);
@@ -426,9 +424,9 @@ fn partial_eq_and_eq() {
426424
#[test]
427425
fn extend() {
428426
let mut set = IndexSet::new();
429-
set.extend(vec![&1, &2, &3, &4]);
430-
set.extend(vec![5, 6]);
431-
assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![1, 2, 3, 4, 5, 6]);
427+
set.extend([&1, &2, &3, &4]);
428+
set.extend([5, 6]);
429+
assert_eq!(set.into_iter().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
432430
}
433431

434432
#[test]
@@ -852,6 +850,7 @@ fn get_range() {
852850
let result = set.get_range(0..0);
853851
assert_eq!(result.unwrap().len(), 0);
854852

853+
#[expect(clippy::reversed_empty_ranges)]
855854
let result = set.get_range(2..1);
856855
assert!(result.is_none());
857856
}

‎tests/quick.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,9 +796,7 @@ quickcheck_limit! {
796796
// value seen for that key!
797797
let mut last_val_per_key = HashMap::new();
798798
for &(k, v) in input.iter().rev() {
799-
if !last_val_per_key.contains_key(&k) {
800-
last_val_per_key.insert(k, v);
801-
}
799+
last_val_per_key.entry(k).or_insert(v);
802800
}
803801

804802
// iterate over the keys in (A) in order, and match each one with

0 commit comments

Comments
 (0)