Skip to content

Commit d3ab5e1

Browse files
committed
Add range + iterator overload for timmerge
Range overload supports temporaries. Also change a missed std::less<> into std::ranges::less.
1 parent a141e03 commit d3ab5e1

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ template <
5555
requires std::sortable<Iterator, Compare, Projection>
5656
void timmerge(Iterator first, Iterator middle, Iterator last,
5757
Compare compare={}, Projection projection={});
58+
59+
template <
60+
std::ranges::random_access_range Range,
61+
typename Compare = std::ranges::less,
62+
typename Projection = std::identity
63+
>
64+
requires std::sortable<std::ranges::iterator_t<Range>, Compare, Projection>
65+
void timmerge(Range &&range, std::ranges::iterator_t<Range> middle,
66+
Compare compare={}, Projection projection={})
5867
```
5968
6069
## EXAMPLE

include/gfx/timsort.hpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ template <typename RandomAccessIterator, typename Compare, typename Projection>
695695
*/
696696
template <
697697
std::random_access_iterator Iterator,
698-
typename Compare = std::less<>,
698+
typename Compare = std::ranges::less,
699699
typename Projection = std::identity
700700
>
701701
requires std::sortable<Iterator, Compare, Projection>
@@ -707,6 +707,22 @@ void timmerge(Iterator first, Iterator middle, Iterator last,
707707
GFX_TIMSORT_AUDIT(std::is_sorted(first, last, comp, proj) && "Postcondition");
708708
}
709709

710+
/**
711+
* Stably merges two sorted halves [first, middle) and [middle, last) of a range into one
712+
* sorted range [first, last) with a comparison function and a projection function.
713+
*/
714+
template <
715+
std::ranges::random_access_range Range,
716+
typename Compare = std::ranges::less,
717+
typename Projection = std::identity
718+
>
719+
requires std::sortable<std::ranges::iterator_t<Range>, Compare, Projection>
720+
void timmerge(Range &&range, std::ranges::iterator_t<Range> middle,
721+
Compare comp={}, Projection proj={})
722+
{
723+
gfx::timmerge(std::begin(range), middle, std::end(range), comp, proj);
724+
}
725+
710726
/**
711727
* Stably sorts a range with a comparison function and a projection function.
712728
*/

tests/cxx_20_tests.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@
1212
#include "test_helpers.hpp"
1313

1414
TEST_CASE( "support for temporary types" ) {
15+
SECTION( "timsmerge over std::span" ) {
16+
std::vector<int> vec(100);
17+
std::iota(vec.begin(), vec.end(), -25);
18+
test_helpers::shuffle(vec);
19+
20+
auto middle = vec.begin() + 38;
21+
gfx::timsort(vec.begin(), middle);
22+
gfx::timsort(middle, vec.end());
23+
24+
auto view = std::span(vec);
25+
gfx::timmerge(std::span(vec), view.begin() + 38);
26+
CHECK(std::ranges::is_sorted(vec));
27+
}
28+
1529
SECTION( "timsort over std::span" ) {
1630
std::vector<int> vec(50);
1731
std::iota(vec.begin(), vec.end(), -25);

0 commit comments

Comments
 (0)