From a8e1702cfc259acaf8d77dfc154c0303c2fe9617 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sat, 26 Jul 2025 12:12:51 +1000 Subject: [PATCH] Make `ComparisonPair::try_new` return an `Option` This is more idiomatic Rust, and doesn't allow the creation of invalid `ComparisonPair`s. --- kernel/src/lib.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index ebc8cc0..164533b 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -41,13 +41,14 @@ pub struct ComparisonPair { impl ComparisonPair { #[inline] - fn try_new(thread_id: ThreadId, partner: ThreadId) -> (bool, Self) { - let is_valid = partner.as_u32() > thread_id.as_u32(); - let pair = Self { + fn try_new(thread_id: ThreadId, partner: ThreadId) -> Option { + if partner.as_u32() <= thread_id.as_u32() { + return None; + } + Some(Self { lower: thread_id, upper: partner, - }; - (is_valid, pair) + }) } #[inline] @@ -127,13 +128,15 @@ pub fn bitonic_sort_step( let partner = distance.find_partner(thread_id); // Create comparison pair if valid - let (is_valid, pair) = ComparisonPair::try_new(thread_id, partner); - if is_valid && pair.is_in_bounds(num_elements) { - // Determine sort direction for this comparison - let direction = BitonicDirection::from_position(thread_id, stage, sort_order); - - // Perform the comparison and swap - compare_and_swap(data, pair, direction); + let pair = ComparisonPair::try_new(thread_id, partner); + if let Some(pair) = pair { + if pair.is_in_bounds(num_elements) { + // Determine sort direction for this comparison + let direction = BitonicDirection::from_position(thread_id, stage, sort_order); + + // Perform the comparison and swap + compare_and_swap(data, pair, direction); + } } }