Skip to content

Commit c88bb27

Browse files
committed
Add sort
1 parent 627d57d commit c88bb27

File tree

4 files changed

+125
-1
lines changed

4 files changed

+125
-1
lines changed

README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,34 @@ Examples:
395395
* `at_index<0,bool,int,void,char*>``bool`
396396
* `at_index<2,bool,int,void,char*>``void`
397397

398+
#### Header `tao/seq/sort.hpp`
399+
400+
Sort a sequence according to a given predicate.
401+
402+
* `sort_t< typename OP, typename T, T... Ns >`
403+
* `sort_t< typename OP, typename S >`
404+
405+
Examples:
406+
407+
* Given a predicate `less`:
408+
409+
struct less
410+
{
411+
template< typename T, T A, T B >
412+
using apply = std::integral_constant< bool, ( A < B ) >;
413+
};
414+
415+
* `sort_t<less,int,7,-2,3,0,4>``integer_sequence<int,-2,0,3,4,7>`
416+
* `using S = index_sequence<39,4,2,10>`
417+
* `sort_t<less,S>``index_sequence<2,4,10,39>`
418+
398419
## Changelog
399420

400421
### 1.1.0
401422

402423
**Not yet released**
403424

404-
* Added `prod`, `multiply`, `difference`, `index_of_seq`, and `permutate`.
425+
* Added `prod`, `multiply`, `difference`, `index_of_seq`, `permutate`, and `sort`.
405426

406427
### 1.0.2
407428

include/tao/seq/sort.hpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright (c) 2019 Daniel Frey
2+
// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
3+
4+
#ifndef TAO_SEQ_SORT_HPP
5+
#define TAO_SEQ_SORT_HPP
6+
7+
#include <type_traits>
8+
9+
#include "integer_sequence.hpp"
10+
#include "sequence_helper.hpp"
11+
12+
namespace tao
13+
{
14+
namespace seq
15+
{
16+
namespace impl
17+
{
18+
template< typename OP, typename T, T V, typename S, typename R >
19+
struct insert;
20+
21+
template< typename OP, typename T, T V, T... Rs >
22+
struct insert< OP, T, V, integer_sequence< T >, integer_sequence< T, Rs... > >
23+
{
24+
using type = integer_sequence< T, Rs..., V >;
25+
};
26+
27+
template< typename OP, typename T, T V, T N, T... Ns, T... Rs >
28+
struct insert< OP, T, V, integer_sequence< T, N, Ns... >, integer_sequence< T, Rs... > >
29+
{
30+
using type = typename conditional< OP::template apply< T, V, N >::value >::template type<
31+
integer_sequence< T, Rs..., V, N, Ns... >,
32+
typename insert< OP, T, V, integer_sequence< T, Ns... >, integer_sequence< T, Rs..., N > >::type >;
33+
};
34+
35+
template< typename OP, typename Sorted, typename Unsorted >
36+
struct sort;
37+
38+
template< typename OP, typename T, T... Ns >
39+
struct sort< OP, integer_sequence< T, Ns... >, integer_sequence< T > >
40+
{
41+
using type = integer_sequence< T, Ns... >;
42+
};
43+
44+
template< typename OP, typename T, T... Ns, T V, T... Rs >
45+
struct sort< OP, integer_sequence< T, Ns... >, integer_sequence< T, V, Rs... > >
46+
: sort< OP, typename insert< OP, T, V, integer_sequence< T, Ns... >, integer_sequence< T > >::type, integer_sequence< T, Rs... > >
47+
{
48+
};
49+
50+
} // namespace impl
51+
52+
template< typename OP, typename T, T... Ns >
53+
struct sort
54+
: impl::sort< OP, integer_sequence< T >, integer_sequence< T, Ns... > >
55+
{
56+
};
57+
58+
template< typename OP, typename T, T... Ns >
59+
struct sort< OP, integer_sequence< T, Ns... > >
60+
: sort< OP, T, Ns... >
61+
{
62+
};
63+
64+
template< typename OP, typename S >
65+
using sort_t = typename sort< OP, S >::type;
66+
67+
} // namespace seq
68+
69+
} // namespace tao
70+
71+
#endif

src/test/seq/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ set (test_sources
2727
prod.cpp
2828
scale.cpp
2929
select.cpp
30+
sort.cpp
3031
sum.cpp
3132
tail.cpp
3233
tester.cpp

src/test/seq/sort.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (c) 2019 Daniel Frey
2+
// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
3+
4+
#include <tao/seq/make_integer_sequence.hpp>
5+
#include <tao/seq/sort.hpp>
6+
7+
#include <type_traits>
8+
9+
struct less
10+
{
11+
template< typename T, T A, T B >
12+
using apply = std::integral_constant< bool, ( A < B ) >;
13+
};
14+
15+
int main()
16+
{
17+
using namespace tao::seq;
18+
19+
static_assert( std::is_same< sort_t< less, index_sequence<> >, index_sequence<> >::value, "oops" );
20+
21+
static_assert( std::is_same< sort_t< less, index_sequence< 42 > >, index_sequence< 42 > >::value, "oops" );
22+
23+
using S = integer_sequence< int, 7, -2, 3, 0, 4 >;
24+
static_assert( std::is_same< sort_t< less, S >, integer_sequence< int, -2, 0, 3, 4, 7 > >::value, "oops" );
25+
26+
using I = index_sequence< 39, 2, 4, 10 >;
27+
static_assert( std::is_same< sort_t< less, I >, index_sequence< 2, 4, 10, 39 > >::value, "oops" );
28+
29+
using L = index_sequence< 54, 12, 45, 20, 91, 99, 16, 73, 62, 19, 30, 34, 67, 49, 18, 11, 25, 22, 86, 87, 44, 2, 21, 79, 15, 41, 55, 84, 48, 75, 23, 68, 88, 94, 40, 72, 71, 69, 57, 35, 90, 4, 56, 6, 10, 80, 64, 50, 28, 1, 52, 27, 5, 0, 78, 32, 7, 24, 14, 13, 65, 70, 83, 81, 51, 33, 37, 66, 47, 29, 42, 93, 89, 9, 46, 77, 58, 60, 3, 76, 92, 63, 39, 96, 53, 26, 31, 17, 38, 85, 98, 59, 43, 97, 95, 36, 74, 61, 8, 82 >;
30+
static_assert( std::is_same< sort_t< less, L >, make_index_sequence< 100 > >::value, "oops" );
31+
}

0 commit comments

Comments
 (0)