From 3e55934381e16c6b6b44b0c2416067582f3b2cfc Mon Sep 17 00:00:00 2001 From: Daniel James Date: Sun, 1 Mar 2009 14:15:39 +0000 Subject: [PATCH] Make the sort stable. Doesn't really matter, but it might as well be. [SVN r51505] --- test/helpers/list.hpp | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/test/helpers/list.hpp b/test/helpers/list.hpp index 14e1427c..5197de68 100644 --- a/test/helpers/list.hpp +++ b/test/helpers/list.hpp @@ -243,14 +243,28 @@ namespace test node** merge_adjacent_ranges(node** first, node** second, node** third, Less less) { - while(first != second) { - if(less((*second)->value_, (*first)->value_)) { - swap_adjacent_ranges(first, second, third); - std::swap(second, third); - } - first = &(*first)->next_; + while(true) { + while(true) { + if(first == second) return third; + if(less((*second)->value_, (*first)->value_)) break; + first = &(*first)->next_; + } + + swap_adjacent_ranges(first, second, third); + first = &(*first)->next_; + + // Since the two ranges we just swapped, the order is now: + // first...third...second + + while(true) { + if(first == third) return second; + if(!less((*first)->value_, (*third)->value_)) break; + first = &(*first)->next_; + } + + swap_adjacent_ranges(first, third, second); + first = &(*first)->next_; } - return third; } void swap_adjacent_ranges(node** first, node** second, node** third)