32 #ifndef _GLIBCXX_PARALLEL_MERGE_H 
   33 #define _GLIBCXX_PARALLEL_MERGE_H 1 
   53   template<
typename _RAIter1, 
typename _RAIter2,
 
   54            typename _OutputIterator, 
typename _DifferenceTp,
 
   58               _RAIter2& __begin2, _RAIter2 __end2,
 
   59               _OutputIterator __target,
 
   60               _DifferenceTp __max_length, _Compare __comp)
 
   62       typedef _DifferenceTp _DifferenceType;
 
   63       while (__begin1 != __end1 && __begin2 != __end2 && __max_length > 0)
 
   66           if (__comp(*__begin2, *__begin1))
 
   67             *__target++ = *__begin2++;
 
   69             *__target++ = *__begin1++;
 
   73       if (__begin1 != __end1)
 
   75           __target = std::copy(__begin1, __begin1 + __max_length, __target);
 
   76           __begin1 += __max_length;
 
   80           __target = std::copy(__begin2, __begin2 + __max_length, __target);
 
   81           __begin2 += __max_length;
 
  101   template<
typename _RAIter1, 
typename _RAIter2,
 
  102            typename _OutputIterator, 
typename _DifferenceTp,
 
  106              _RAIter2& __begin2, _RAIter2 __end2,
 
  107              _OutputIterator __target,
 
  108              _DifferenceTp __max_length, _Compare __comp)
 
  110       typedef _DifferenceTp _DifferenceType;
 
  111       typedef typename std::iterator_traits<_RAIter1>::value_type
 
  113       typedef typename std::iterator_traits<_RAIter2>::value_type
 
  116 #if _GLIBCXX_ASSERTIONS 
  117       _GLIBCXX_PARALLEL_ASSERT(__max_length >= 0);
 
  120       while (__begin1 != __end1 && __begin2 != __end2 && __max_length > 0)
 
  122           _RAIter1 __next1 = __begin1 + 1;
 
  123           _RAIter2 __next2 = __begin2 + 1;
 
  124           _ValueType1 __element1 = *__begin1;
 
  125           _ValueType2 __element2 = *__begin2;
 
  127           if (__comp(__element2, __element1))
 
  129               __element1 = __element2;
 
  135           *__target = __element1;
 
  140       if (__begin1 != __end1)
 
  142           __target = std::copy(__begin1, __begin1 + __max_length, __target);
 
  143           __begin1 += __max_length;
 
  147           __target = std::copy(__begin2, __begin2 + __max_length, __target);
 
  148           __begin2 += __max_length;
 
  167   template<
typename _RAIter1, 
typename _RAIter2,
 
  168            typename _OutputIterator, 
typename _DifferenceTp,
 
  170     inline _OutputIterator
 
  172             _RAIter2& __begin2, _RAIter2 __end2,
 
  173             _OutputIterator __target, _DifferenceTp __max_length,
 
  179                   __target, __max_length, __comp);
 
  192   template<
typename _RAIter1, 
typename _RAIter2,
 
  193            typename _RAIter3, 
typename _Compare>
 
  199                  _RAIter2 __end2, _RAIter3 __target, 
typename 
  200                  std::iterator_traits<_RAIter1>::
 
  201                  difference_type __max_length, _Compare __comp)
 
  203                  __max_length, __comp); }
 
  220   template<
typename _RAIter1, 
typename _RAIter3,
 
  224                  _RAIter1& __begin2, _RAIter1 __end2,
 
  225                  _RAIter3 __target, 
typename 
  226                  std::iterator_traits<_RAIter1>::
 
  227                  difference_type __max_length, _Compare __comp)
 
  230           std::iterator_traits<_RAIter1>::value_type _ValueType;
 
  231       typedef typename std::iterator_traits<_RAIter1>::
 
  232         difference_type _DifferenceType1 ;
 
  233       typedef typename std::iterator_traits<_RAIter3>::
 
  234         difference_type _DifferenceType3;
 
  243      <  
true, _IteratorPair*,
 
  244      _Compare, _DifferenceType1>, __max_length, __comp,
 
  245      omp_get_max_threads());
 
_OutputIterator __merge_advance_usual(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements. 
 
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects. 
 
_RAIter3 parallel_multiway_merge(_RAIterIterator __seqs_begin, _RAIterIterator __seqs_end, _RAIter3 __target, _Splitter __splitter, _DifferenceTp __length, _Compare __comp, _ThreadIndex __num_threads)
Parallel multi-way merge routine. 
 
Includes the original header files concerned with iterators except for stream iterators. This file is a GNU parallel extension to the Standard C++ Library. 
 
void multiway_merge_exact_splitting(_RAIterIterator __seqs_begin, _RAIterIterator __seqs_end, _DifferenceType __length, _DifferenceType __total_length, _Compare __comp, std::vector< std::pair< _DifferenceType, _DifferenceType > > *__pieces)
Exact splitting for parallel multiway-merge routine. 
 
_OutputIterator __merge_advance_movc(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements. 
 
GNU parallel code for public use. 
 
A pair of iterators. The usual iterator operations are applied to both child iterators. 
 
_RAIter3 __parallel_merge_advance(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _RAIter3 __target, typename std::iterator_traits< _RAIter1 >::difference_type __max_length, _Compare __comp)
Merge routine fallback to sequential in case the iterators of the two input sequences are of differen...
 
#define _GLIBCXX_CALL(__n)
Macro to produce log message when entering a function. 
 
Struct holding two objects of arbitrary type. 
 
_OutputIterator __merge_advance(_RAIter1 &__begin1, _RAIter1 __end1, _RAIter2 &__begin2, _RAIter2 __end2, _OutputIterator __target, _DifferenceTp __max_length, _Compare __comp)
Merge routine being able to merge only the __max_length smallest elements.