|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 // OPTIONAL pfc feature, include on need to use basis
|
|
|
4 // std sort interop methods
|
|
|
5
|
|
|
6 #include <algorithm>
|
|
|
7 #include <functional>
|
|
|
8 #include <vector>
|
|
|
9
|
|
|
10 namespace pfc {
|
|
|
11
|
|
|
12 std::vector<size_t> sort_identity( size_t count ) {
|
|
|
13 std::vector<size_t> ret; ret.resize(count);
|
|
|
14 for( size_t walk = 0; walk < ret.size(); ++ walk) ret[walk] = walk;
|
|
|
15 return ret;
|
|
|
16 }
|
|
|
17
|
|
|
18 template<typename iterator_t, typename predicate_t>
|
|
|
19 std::vector<size_t> sort_get_order(iterator_t i1, iterator_t i2, predicate_t pred ) {
|
|
|
20 auto ret = sort_identity( i2 - i1 );
|
|
|
21 auto pred2 = [pred, i1] (size_t idx1, size_t idx2) {
|
|
|
22 return pred( *(i1+idx1), *(i1+idx2));
|
|
|
23 };
|
|
|
24 std::sort(ret.begin(), ret.end(), pred2);
|
|
|
25 return ret;
|
|
|
26 }
|
|
|
27
|
|
|
28 }
|