mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
fix reversed case
This commit is contained in:
parent
f91a9d716d
commit
afe6128b1f
1 changed files with 68 additions and 71 deletions
|
@ -1391,16 +1391,14 @@ fn quad_swap(
|
|||
arr_ptr += 8 * element_width;
|
||||
continue :outer;
|
||||
},
|
||||
// TODO: Figure out why the reversed case below is broken in some cases.
|
||||
// Note, it seems like the reverse itself is not broken, but the count and pointer become off somehow.
|
||||
// 15 => {
|
||||
// // potentially already reverse ordered, check rest!
|
||||
// if (compare(cmp, cmp_data, arr_ptr + 1 * element_width, arr_ptr + 2 * element_width) == GT and compare(cmp, cmp_data, arr_ptr + 3 * element_width, arr_ptr + 4 * element_width) == GT and compare(cmp, cmp_data, arr_ptr + 5 * element_width, arr_ptr + 6 * element_width) == GT) {
|
||||
// reverse_head = arr_ptr;
|
||||
// break :switch_state .reversed;
|
||||
// }
|
||||
// break :switch_state .not_ordered;
|
||||
// },
|
||||
15 => {
|
||||
// potentially already reverse ordered, check rest!
|
||||
if (compare(cmp, cmp_data, arr_ptr + 1 * element_width, arr_ptr + 2 * element_width) == GT and compare(cmp, cmp_data, arr_ptr + 3 * element_width, arr_ptr + 4 * element_width) == GT and compare(cmp, cmp_data, arr_ptr + 5 * element_width, arr_ptr + 6 * element_width) == GT) {
|
||||
reverse_head = arr_ptr;
|
||||
break :switch_state .reversed;
|
||||
}
|
||||
break :switch_state .not_ordered;
|
||||
},
|
||||
else => {
|
||||
break :switch_state .not_ordered;
|
||||
},
|
||||
|
@ -1491,7 +1489,6 @@ fn quad_swap(
|
|||
}
|
||||
|
||||
// Just an unorderd block, do it inplace.
|
||||
|
||||
inline for ([4]u4{ v1, v2, v3, v4 }) |v| {
|
||||
const x = if (v == 0) element_width else 0;
|
||||
const not_x = if (v != 0) element_width else 0;
|
||||
|
@ -1505,7 +1502,7 @@ fn quad_swap(
|
|||
if (compare(cmp, cmp_data, arr_ptr + 1 * element_width, arr_ptr + 2 * element_width) == GT or compare(cmp, cmp_data, arr_ptr + 3 * element_width, arr_ptr + 4 * element_width) == GT or compare(cmp, cmp_data, arr_ptr + 5 * element_width, arr_ptr + 6 * element_width) == GT) {
|
||||
quad_swap_merge(arr_ptr, swap, cmp, cmp_data, element_width, copy);
|
||||
}
|
||||
arr_ptr += 8;
|
||||
arr_ptr += 8 * element_width;
|
||||
continue :outer;
|
||||
}
|
||||
|
||||
|
@ -1637,68 +1634,68 @@ fn quad_reversal(
|
|||
}
|
||||
}
|
||||
|
||||
// test "quad_swap" {
|
||||
// var arr: [75]i64 = undefined;
|
||||
// var arr_ptr = @as([*]u8, @ptrCast(&arr[0]));
|
||||
test "quad_swap" {
|
||||
var arr: [75]i64 = undefined;
|
||||
var arr_ptr = @as([*]u8, @ptrCast(&arr[0]));
|
||||
|
||||
// arr = [75]i64{
|
||||
// // multiple ordered chunks
|
||||
// 1, 3, 5, 7, 9, 11, 13, 15,
|
||||
// //
|
||||
// 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
// // partially ordered
|
||||
// 41, 42, 45, 46, 43, 44, 47, 48,
|
||||
// // multiple reverse chunks
|
||||
// 70, 69, 68, 67, 66, 65, 64, 63,
|
||||
// //
|
||||
// 16, 14, 12, 10, 8, 6, 4, 2,
|
||||
// // another ordered
|
||||
// 49, 50, 51, 52, 53, 54, 55, 56,
|
||||
// // unordered
|
||||
// 23, 21, 19, 20, 24, 22, 18, 17,
|
||||
// // partially reversed
|
||||
// 32, 31, 28, 27, 30, 29, 26, 25,
|
||||
// // awkward tail
|
||||
// 62, 59, 61, 60, 71, 73, 75, 74,
|
||||
// //
|
||||
// 72, 58, 57,
|
||||
// };
|
||||
arr = [75]i64{
|
||||
// multiple ordered chunks
|
||||
1, 3, 5, 7, 9, 11, 13, 15,
|
||||
//
|
||||
33, 34, 35, 36, 37, 38, 39, 40,
|
||||
// partially ordered
|
||||
41, 42, 45, 46, 43, 44, 47, 48,
|
||||
// multiple reverse chunks
|
||||
70, 69, 68, 67, 66, 65, 64, 63,
|
||||
//
|
||||
16, 14, 12, 10, 8, 6, 4, 2,
|
||||
// another ordered
|
||||
49, 50, 51, 52, 53, 54, 55, 56,
|
||||
// unordered
|
||||
23, 21, 19, 20, 24, 22, 18, 17,
|
||||
// partially reversed
|
||||
32, 31, 28, 27, 30, 29, 26, 25,
|
||||
// awkward tail
|
||||
62, 59, 61, 60, 71, 73, 75, 74,
|
||||
//
|
||||
72, 58, 57,
|
||||
};
|
||||
|
||||
// var result = quad_swap(arr_ptr, 75, &test_i64_compare, null, @sizeOf(i64), &test_i64_copy);
|
||||
// try testing.expectEqual(result, .unfinished);
|
||||
// try testing.expectEqual(arr, [75]i64{
|
||||
// // first 32 elements sorted (with 8 reversed that get flipped here)
|
||||
// 1, 2, 3, 4, 5, 6, 7, 8,
|
||||
// //
|
||||
// 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
// //
|
||||
// 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
// //
|
||||
// 41, 42, 43, 44, 45, 46, 47, 48,
|
||||
// // second 32 elements sorted (with 8 reversed that get flipped here)
|
||||
// 17, 18, 19, 20, 21, 22, 23, 24,
|
||||
// //
|
||||
// 25, 26, 27, 28, 29, 30, 31, 32,
|
||||
// //
|
||||
// 49, 50, 51, 52, 53, 54, 55, 56,
|
||||
// //
|
||||
// 63, 64, 65, 66, 67, 68, 69, 70,
|
||||
// // awkward tail
|
||||
// 57, 58, 59, 60, 61, 62, 71, 72,
|
||||
// //
|
||||
// 73, 74, 75,
|
||||
// });
|
||||
var result = quad_swap(arr_ptr, 75, &test_i64_compare, null, @sizeOf(i64), &test_i64_copy);
|
||||
try testing.expectEqual(result, .unfinished);
|
||||
try testing.expectEqual(arr, [75]i64{
|
||||
// first 32 elements sorted (with 8 reversed that get flipped here)
|
||||
1, 2, 3, 4, 5, 6, 7, 8,
|
||||
//
|
||||
9, 10, 11, 12, 13, 14, 15, 16,
|
||||
//
|
||||
33, 34, 35, 36, 37, 38, 39, 40,
|
||||
//
|
||||
41, 42, 43, 44, 45, 46, 47, 48,
|
||||
// second 32 elements sorted (with 8 reversed that get flipped here)
|
||||
17, 18, 19, 20, 21, 22, 23, 24,
|
||||
//
|
||||
25, 26, 27, 28, 29, 30, 31, 32,
|
||||
//
|
||||
49, 50, 51, 52, 53, 54, 55, 56,
|
||||
//
|
||||
63, 64, 65, 66, 67, 68, 69, 70,
|
||||
// awkward tail
|
||||
57, 58, 59, 60, 61, 62, 71, 72,
|
||||
//
|
||||
73, 74, 75,
|
||||
});
|
||||
|
||||
// // Just reversed.
|
||||
// var expected: [75]i64 = undefined;
|
||||
// for (0..75) |i| {
|
||||
// expected[i] = @intCast(i + 1);
|
||||
// arr[i] = @intCast(75 - i);
|
||||
// }
|
||||
// result = quad_swap(arr_ptr, 75, &test_i64_compare, null, @sizeOf(i64), &test_i64_copy);
|
||||
// try testing.expectEqual(result, .sorted);
|
||||
// try testing.expectEqual(arr, expected);
|
||||
// }
|
||||
// Just reversed.
|
||||
var expected: [75]i64 = undefined;
|
||||
for (0..75) |i| {
|
||||
expected[i] = @intCast(i + 1);
|
||||
arr[i] = @intCast(75 - i);
|
||||
}
|
||||
result = quad_swap(arr_ptr, 75, &test_i64_compare, null, @sizeOf(i64), &test_i64_copy);
|
||||
try testing.expectEqual(result, .sorted);
|
||||
try testing.expectEqual(arr, expected);
|
||||
}
|
||||
|
||||
test "quad_swap_merge" {
|
||||
var arr: [8]i64 = undefined;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue