Skip to content
This repository has been archived by the owner on Oct 22, 2024. It is now read-only.

Avoid setRange with potentially incompatible types #320

Merged
merged 5 commits into from
Nov 21, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

- Adds `shuffled` to `IterableExtension`.
- Shuffle `IterableExtension.sample` results.
- Fix `mergeSort` when the runtime iterable generic is a subtype of the static
generic.
- Require Dart `^3.1.0`
- Mark "mixin" classes as `mixin`.

Expand Down
4 changes: 2 additions & 2 deletions lib/src/algorithms.dart
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ void mergeSort<E>(List<E> elements,
var middle = start + firstLength;
var secondLength = end - middle;
// secondLength is always the same as firstLength, or one greater.
var scratchSpace = List<E>.filled(secondLength, elements[start]);
var scratchSpace = elements.sublist(0, secondLength);
_mergeSort(elements, identity<E>, compare, middle, end, scratchSpace, 0);
var firstTarget = end - firstLength;
_mergeSort(
Expand Down Expand Up @@ -268,7 +268,7 @@ void mergeSortBy<E, K>(List<E> elements, K Function(E element) keyOf,
var firstLength = middle - start;
var secondLength = end - middle;
// secondLength is always the same as firstLength, or one greater.
var scratchSpace = List<E>.filled(secondLength, elements[start]);
var scratchSpace = elements.sublist(0, secondLength);
_mergeSort(elements, keyOf, compare, middle, end, scratchSpace, 0);
var firstTarget = end - firstLength;
_mergeSort(elements, keyOf, compare, start, middle, elements, firstTarget);
Expand Down
9 changes: 9 additions & 0 deletions test/algorithms_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,15 @@ void main() {
reverse(l, 0, 6);
expect(l, equals([2, 1, 4, 3, 6, 5]));
});

test('mergeSort works when runtime generic is a subtype of the static type',
() {
// Regression test for https://github.com/dart-lang/collection/issues/317
final length = 1000; // Larger than _mergeSortLimit
// In order list, first half empties first during merge.
final list = List<int>.generate(length, (i) => i);
natebosch marked this conversation as resolved.
Show resolved Hide resolved
expect(() => mergeSort<num>(list), returnsNormally);
});
}

class C {
Expand Down