| 21 | |
| 22 | template<typename Iterator> |
| 23 | struct ParallelMergeRange { |
| 24 | static size_t grainsize; |
| 25 | Iterator begin1, end1; // [begin1,end1) is 1st sequence to be merged |
| 26 | Iterator begin2, end2; // [begin2,end2) is 2nd sequence to be merged |
| 27 | Iterator out; // where to put merged sequence |
| 28 | bool empty() const {return (end1-begin1)+(end2-begin2)==0;} |
| 29 | bool is_divisible() const { |
| 30 | return (std::min)( end1-begin1, end2-begin2 ) > grainsize; |
| 31 | } |
| 32 | ParallelMergeRange( ParallelMergeRange& r, split ) { |
| 33 | if( r.end1-r.begin1 < r.end2-r.begin2 ) { |
| 34 | std::swap(r.begin1,r.begin2); |
| 35 | std::swap(r.end1,r.end2); |
| 36 | } |
| 37 | Iterator m1 = r.begin1 + (r.end1-r.begin1)/2; |
| 38 | Iterator m2 = std::lower_bound( r.begin2, r.end2, *m1 ); |
| 39 | begin1 = m1; |
| 40 | begin2 = m2; |
| 41 | end1 = r.end1; |
| 42 | end2 = r.end2; |
| 43 | out = r.out + (m1-r.begin1) + (m2-r.begin2); |
| 44 | r.end1 = m1; |
| 45 | r.end2 = m2; |
| 46 | } |
| 47 | ParallelMergeRange( Iterator begin1_, Iterator end1_, |
| 48 | Iterator begin2_, Iterator end2_, |
| 49 | Iterator out_ ) : |
| 50 | begin1(begin1_), end1(end1_), |
| 51 | begin2(begin2_), end2(end2_), out(out_) |
| 52 | {} |
| 53 | }; |
| 54 | |
| 55 | template<typename Iterator> |
| 56 | size_t ParallelMergeRange<Iterator>::grainsize = 1000; |
nothing calls this directly
no outgoing calls
no test coverage detected